1
resposta

Código do SqlLoggerProvider não aparece nada no console

O comando sql não aparece no console. Já tentei com o código fornecido na aula: using Microsoft.EntityFrameworkCore.Storage; using Microsoft.Extensions.Logging; using System;

namespace Alura.Loja.Testes.ConsoleApp { public class SqlLoggerProvider : ILoggerProvider { public static ILoggerProvider Create() { return new SqlLoggerProvider(); }

    public ILogger CreateLogger(string categoryName)
    {
        if (categoryName == typeof(IRelationalCommandBuilderFactory).FullName)
        {
            return new SqlLogger();
        }
        return new NullLogger();
    }

    public void Dispose()
    {

    }
}

internal class NullLogger : ILogger
{
    public IDisposable BeginScope<TState>(TState state)
    {
        return null;
    }

    public bool IsEnabled(LogLevel logLevel)
    {
        return true;
    }

    public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
    {
        //não faz nada
    }
}

public class SqlLogger : ILogger
{
    public IDisposable BeginScope<TState>(TState state)
    {
        return null;
    }

    public bool IsEnabled(LogLevel logLevel)
    {
        return true;
    }

    public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
    {
        Console.WriteLine("");
        Console.WriteLine(formatter(state, exception));
        Console.WriteLine("");
    }
}

}

Já tentei com o código fornecido em fórum: using Microsoft.EntityFrameworkCore.Storage; using Microsoft.Extensions.Logging; using System;

namespace Alura.Loja.Testes.ConsoleApp { public class SqlLoggerProvider : ILoggerProvider { public static ILoggerProvider Create() { return new SqlLoggerProvider(); }

    public ILogger CreateLogger(string categoryName)
    {
        if (categoryName == typeof(IRelationalCommandBuilderFactory).Fullname)
        {
            return new SqlLogger();
        }
        return new NullLogger();
    }

    public void Dispose(){

    }
    internal class NullLogger : ILogger
    {
        public IDisposable BeginScope<TState>(TState state)
        {
            return null;
        }

        public bool IsEnabled(LogLevel logLevel)
        {
            return true;
        }

        public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception)
        {
            //não faz nada, caso esteja faltando algum parametro, você pode usar o auto complete do Visual Studio para montar esse método melhor.
        }
    }

    public class SqlLogger : ILogger
    {
        public IDisposable BeginScope<TState>(TState state)
        {
            return null;
        }

        public bool IsEnabled(LogLevel logLevel)
        {
            return true;
        }

        public void Log<TState>(LogLevel logLevel,EventId eventId, TState state, Exception e)
        {
            Console.WriteLine("");
            Console.WriteLine(formatter(state,exception));
            Console.WriteLine("");
        }
    }
}

}

Com esse código fornecido no fórum ainda da alguns erros. De nada adianta o do fórum estar alterado sendo que apresenta erros.

1 resposta

Olá, Artur!

Pelo que entendi, você está tendo problemas para visualizar os comandos SQL no console. Vamos tentar resolver isso juntos.

Primeiramente, verifique se você adicionou o SqlLoggerProvider corretamente ao loggerFactory no método Main(). De acordo com o texto da aula, o código deveria ser assim:

class Program
{
    static void Main(string[] args)
    {
        using (var contexto = new LojaContext())
        {
            var serviceProvider = contexto.GetInfrasctructure<IServiceProvider>();
            var loggerFactory = serviceProvider.GetService<ILoggerFactory>();
            loggerFactory.AddProvider(SqlLoggerProvider.Create());

            // ...
        }
    }
}

Agora, vamos analisar o código do SqlLoggerProvider. No método CreateLogger(), você está comparando o categoryName com typeof(IRelationalCommandBuilderFactory).FullName. Isso está correto, pois o IRelationalCommandBuilderFactory é responsável por construir os comandos SQL que queremos logar.

No entanto, observe que no código que você pegou do fórum, está escrito Fullname (com 'n' minúsculo) em vez de FullName. Isso pode estar causando um erro de compilação, pois Fullname não é uma propriedade válida. Certifique-se de que está usando FullName.

Além disso, no método Log<TState> da classe SqlLogger, você está usando formatter(state,exception) para formatar a mensagem de log. Isso está correto, mas no código do fórum, esse método está faltando o parâmetro formatter. Isso pode estar causando outro erro de compilação. O método correto seria:

public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
{
    Console.WriteLine("");
    Console.WriteLine(formatter(state, exception));
    Console.WriteLine("");
}

Por fim, lembre-se de que o SqlLoggerProvider só vai logar os comandos SQL quando eles forem executados. Portanto, certifique-se de que está chamando contexto.SaveChanges() depois de fazer alguma modificação nos dados.

Espero que essas dicas ajudem a resolver o problema. Se ainda estiver com dificuldades, por favor, compartilhe mais detalhes sobre os erros que está encontrando.

Espero ter ajudado e bons estudos!