Como rastrear problemas do log4net

191

Eu uso o log4net o tempo todo, mas uma coisa que eu nunca descobri é como saber o que está acontecendo por dentro. Por exemplo, eu tenho um aplicativo de console e um aplicativo de banco de dados no meu projeto. Fiz algumas alterações no banco de dados e no código, e agora o appender do banco de dados não funciona mais. Vou descobrir por que, eventualmente, mas ajudaria muito se eu pudesse ver o que está acontecendo dentro do log4net.

O log4net gera algum tipo de saída que eu possa visualizar para tentar determinar a origem do meu problema?

John M Gant
fonte

Respostas:

293

Primeiro, você deve definir esse valor no arquivo de configuração do aplicativo:

<configuration>
   <appSettings>
      <add key="log4net.Internal.Debug" value="true"/>
   </appSettings>
</configuration>

Em seguida, para determinar o arquivo no qual você deseja salvar a saída, adicione o seguinte código no mesmo arquivo .config:

<configuration>
...

<system.diagnostics>
    <trace autoflush="true">
        <listeners>
            <add 
                name="textWriterTraceListener" 
                type="System.Diagnostics.TextWriterTraceListener" 
                initializeData="C:\tmp\log4net.txt" />
        </listeners>
    </trace>
</system.diagnostics>

...
</configuration>

Você pode encontrar uma explicação mais detalhada em 'Como habilitar a depuração interna do log4net?' na página de perguntas frequentes do log4net .

David Espart
fonte
10
Apenas verifique se o processo em que seu aplicativo está sendo executado tem direitos para o caminho em que você deseja criar seu arquivo de texto de log ("C: \ tmp \ log4net.txt" no exemplo acima)
NMrt
3
Parece que o does not depuração interna têm timestamps
snit80
4
Eu mudei de C:\tmp\log4net.txtpara C:\log4net.txt, então ele pode gerar um arquivo de texto.
Frank Myat Qui
6
Apenas uma nota que achei da maneira divertida. Verifique se esta <configSections></configSections>é a primeira entrada em <configuration>. Caso contrário, você acaba com um erro.
24517 Nick
2
Isso não mostra a hora das entradas no arquivo de log. Eu tentei definir atributos traceOutputOptions="TimeStamp"e traceOutputOptions="DateTime"na addtag, mas isso não altera nada no conteúdo do arquivo de log. Alguém sabe como configurar o log4net para mostrar o tempo de cada linha / entrada no arquivo de log de rastreamento?
Ulysses Alves
43

Se você estiver usando um arquivo de configuração log4net, também poderá ativar a depuração alterando o nó superior para:

<log4net debug="true">

Isso funcionará assim que a configuração for recarregada e assumindo que o ouvinte de rastreamento esteja configurado corretamente.

Bolo
fonte
6
Quando esse sinalizador estiver ativado - você poderá ver os logs de diagnóstico do log4net na janela Saída do Visual Studio
Naren
24

Além da resposta acima, você pode usar esta linha para ver o log em tempo real, em vez da saída c: \ tmp \ log4net.txt.

log4net.Util.LogLog.InternalDebugging = true;

Por exemplo, em um aplicativo de console, você pode adicionar isso e assistir à saída em tempo real. É bom depurar o log4net em um pequeno equipamento de teste para ver o que está acontecendo com o aplicativo que você está testando.

JP Toto
fonte
8

Verifique se o aplicativo raiz onde seu ponto de entrada está registra algo no log4net. Dê um destes:

private static ILog logger = LogManager.GetLogger(typeof(Program));
static void Main(string[] args)
{
    logger.InfoFormat("{0} v.{1} started.", Assembly.GetExecutingAssembly().GetName().Name, Assembly.GetExecutingAssembly().GetName().Version.ToString());

Com o 2.0.8, eu tive uma situação interessante. Criei um projeto de biblioteca e um projeto de teste exe que demonstraria suas capacidades. O projeto da biblioteca foi configurado para usar o Log4net como era o projeto exe. O projeto exe usou o atributo assemblyinfo para registrar a configuração, mas eu não estava obtendo nenhuma saída de log no console ou no arquivo de log. Quando ativei o log de depuração interna do log4net, recebi algumas mensagens internas gravadas no console, mas ainda assim nenhum dos meus logs normais. Nenhum erro estava sendo relatado. Tudo começou a funcionar quando adicionei o código acima ao meu programa. Caso contrário, o Log4net foi configurado corretamente.

K0D4
fonte
1
salvou o meu também :-)
costa
2

Se o log interno não fornecer informações suficientes, é muito fácil criar e depurar o código fonte . Se você não quiser misturar isso com o seu projeto de desenvolvimento, adicione um aplicativo de console simples que apenas registre uma mensagem, copie o seu projeto log4net.configpara esse aplicativo e depure a classe em questão.

StuartN
fonte
2

No log4net 2.0.8, parece não ser possível fazer o log com o log4net em uma DLL separada. Se eu tentei isso, os resultados são muito estranhos: nenhum log é realizado. E a inicialização do log4net com a opção debug não mostra erros.

Como o K0D4 disse, você deve ter uma referência ao log4net no seu módulo principal e deve ligar uma vez no início do Programa e está tudo bem.

Na próxima versão do log4net, esse bug provavelmente será corrigido.

olaf870
fonte