Pergunta

Estou investigando as diferenças entre usar log4net e System.Diagnostics.Trace para registro, e estou curioso sobre as diferenças de desempenho que eu observadas.

Eu criei um aplicativo de teste para comparar o desempenho dos dois métodos de registro em vários cenários, e eu estou achando que log4net é significativamente mais lento do que a classe Trace. Por exemplo, em um cenário onde eu entro 1.000 mensagens sem formatação de strings, de log4net tempo de execução média mais de 1.000 ensaios é 9.00ms. executa Trace com uma média de 1.13ms. Muitos dos meus casos de teste têm uma quantidade relativamente grande de variação nos tempos de execução log4net; a natureza periódica de outlier longas execuções parece sugerir interferência GC. Bisbilhotando com CLR Profiler confirma há uma grande quantidade de coleções para uma tonelada de objetos log4net.Core.LoggingEvent que são gerados (para ser justo, parece que Trace gera uma tonelada de Char[] objetos, bem como, mas não exibe a grande variação que log4net faz.)

Uma coisa que eu estou mantendo em mente, aqui estão que mesmo que log4net parece cerca de 9 vezes mais lento que Trace, a diferença é de 8ms mais de 1.000 iterações; isso não é exatamente uma fuga significativa de desempenho. Ainda assim, alguns dos meus casos de uso esperados pode ser chamada de métodos que estão registrando coisas centenas de milhares de vezes, e esses números são de minha máquina rápida. Em uma máquina mais lenta mais típico de configurações dos nossos usuários a diferença é 170ms para 11ms que é um pouco mais alarmante.

É este o desempenho típico de log4net, ou existem alguns truques que podem aumentar significativamente do log4net desempenho?

( NOTA: Estou ciente de que cadeia de formatação podem alterar o tempo de execução; Eu estou tentando comparar maçãs com maçãs e eu tenho casos de teste sem formatação e teste casos com formatação; estadias log4net como proporcionalmente lento se corda formatação é usado ou não. )

A história até agora:

  • Robert Gould tem a melhor resposta para a pergunta; Eu estava principalmente curioso para saber se era típico para ver log4net executar muito mais lento do que a classe Trace.
  • A resposta de Alex Shnayder é uma informação interessante, mas realmente não se enquadra no âmbito da questão. Metade da intenção para a introdução desta logging é ajudar na depuração de ambos os problemas lógicos e desempenho em sistemas vivos; nossos clientes colocar nossos produtos em muitos cenários exóticos que muitas vezes são difíceis de reproduzir, sem configurações de hardware de grande escala caro e. A minha principal preocupação é que uma grande diferença de tempo entre o "não logging" e "logging" poderia afetar o sistema de maneira tal que os erros não acontecem. No final, a escala da redução de desempenho é grande, mas a magnitude é pequena, por isso estou esperando que não será um problema.
Foi útil?

Solução

Sim log4xxx é mais lento do que traço, desde traço é normalmente uma ferramenta kernel do próximo, enquanto log4xxx é uma ferramenta muito mais poderosa. Pessoalmente eu prefiro log4xxx por causa de sua fexibility, mas se você quiser algo que não tem impacto tanto, e você realmente não precisa de registos para a produção de, digamos, em depuração único traço deve ser suficiente.

Nota: Eu uso log4xxx porque o exato mesmo se aplica a todos os idiomas com uma biblioteca log4 não apenas .Net

Outras dicas

Você pode estar interessado no Common.Logging biblioteca . É um invólucro abstração fina sobre implementações de registro existentes e permite que você conecte em qualquer estrutura de log você como em tempo de execução. Também é muito mais rápido, em seguida, System.Diagnostics.Trace como descrito no meu post sobre o desempenho .

hth, Erich

Do meu desempenho experiência log4net não é um problema na maioria dos casos. A verdadeira questão é, por que você precisa mesmo de "coisas madeireiras centenas de milhares de vezes" em um sistema de produção.
A meu ver, na produção você deve log mínimo só nua (informações nd pode ser nível de aviso), e somente se necessário (depuração de um problema no local) deverá ativar a depuração no nível de depuração.

Se você quer o melhor dos dois mundos, log4net irá permitir que você faça login com o traçador aspnet também. I activar esta opção quando deseja obter estatísticas de desempenho que são amarrados para eventos específicos no meu registro.

Com apenas executar um teste comparando a escrita sequental para um arquivo simples em comparação com usando Log4Net para o mesmo task.Log4Net é operatório em relação a cerca de 400 vezes mais lenta a um StreamWriter.So eu considero Log4Net não utilizável se você estiver escrevendo a enorme arquivos de log . Mas acho que é muito útil para pequenas quantidades de entradas de log e depuração.

Talvez uma solução para o registo isolado em um segmento separado em alguns casos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top