Log em Java vs Log4J [fechado]

134

Ainda vale a pena adicionar a biblioteca log4j a um projeto Java 5 apenas para registrar, digamos, algumas exceções a um arquivo com algumas boas configurações de sobreposição. Ou o utilitário util.logging padrão também fará o trabalho?

O que você acha?

Okami
fonte
Consulte stackoverflow.com/a/13144054/603516 para obter vários problemas de bloqueio do log4j 1.2 a serem considerados.
Vadzim

Respostas:

115

Eu diria que você provavelmente está bem com util.logging para as necessidades que você descreve.

Para uma boa árvore de decisão, dê uma olhada no Log4j vs java.util.logging

Pergunta 1: Você antecipa a necessidade de algum dos manipuladores inteligentes que o Log4j possui e que o JUL não possui, como o SMTPHandler, o NTEventLogHandler ou qualquer um dos FileHandlers muito convenientes?

Pergunta dois: Você se vê desejando mudar frequentemente o formato da sua saída de log? Você precisará de uma maneira fácil e flexível de fazer isso? Em outras palavras, você precisa do PatternLayout do Log4j?

Pergunta três: Você prevê uma necessidade definitiva da capacidade de alterar configurações complexas de log em seus aplicativos, depois que eles são compilados e implantados em um ambiente de produção? Sua configuração parece algo como "Mensagens graves desta classe são enviadas por e-mail para o suporte; mensagens graves de um subconjunto de classes são registradas em um syslog deamon em nosso servidor; mensagens de aviso de outro subconjunto de classes são registradas para um arquivo na unidade de rede A; e todas as mensagens de todos os lugares são registradas em um arquivo na unidade de rede B "? E você se vê aprimorando a cada dois dias?

Se você puder responder sim a qualquer uma das perguntas acima, acesse Log4j. Se você responder um não definitivo a todos eles, o JUL será mais do que adequado e já está convenientemente incluído no SDK.

Dito isto, praticamente todos os projetos hoje em dia acabam incluindo o log4j, mesmo que apenas por alguma outra biblioteca o utilize.

Matt Sheppard
fonte
1
Ótima resposta baseada em questionário. Para cada um o seu com base nas necessidades.
HopeKing 10/03/2017
43

Eu recomendo que você use o Simple Logging Facade for Java (SLF4J). Ele suporta diferentes provedores que incluem o Log4J e pode ser usado como um substituto para o Apache Commons Logging.

Brian Matthews
fonte
6
O que há de errado com o Commons Logging?
Bart van Heukelom
5
@Bart van Heukelom e comentários positivos - leia articles.qos.ch/thinkAgain.html
Stephen C
4
@ Stephen C: Obrigado pela informação, embora eu tenha aprendido isso há algum tempo e agora estou usando o SLF4J sempre que posso. (Meu comentário foi uma verdadeira questão btw, não uma observação conservadora)
Bart van Heukelom
1
@ Bart, Commons Logging usa descoberta dinâmica do pacote a ser usado. O SLF4J usa (ou costumava) precisar das classes no back-end para carregar.
Thorbjørn Ravn Andersen
21

O Log4j existe há muito tempo e funciona muito bem. Não tenho estudos científicos para apoiá-lo, mas com base no que vi em um grande número de clientes, é facilmente a estrutura de log que vejo usada mais do que qualquer outra. Ele existe há muito tempo e não foi substituído pelo Next Big Logging Framework, que diz algo.

É simples de configurar e fácil de aprender os anexos básicos (saídas). Existem anexos de host completos disponíveis, incluindo:

  1. ConsoleAppender
  2. DailyRollingFileAppender
  3. ExternallyRolledFileAppender
  4. FileAppender
  5. JDBCAppender
  6. JMSAppender
  7. NTEventLogAppender
  8. RollingFileAppender
  9. SMTPAppender
  10. SocketAppender
  11. SyslogAppender
  12. TelnetAppender
  13. WriterAppender

Mais outros. Também não é difícil escrever seu próprio aplicativo. Além disso, há uma grande flexibilidade em cada um dos anexos que permite controlar especificamente o que é produzido no seu log.

Uma observação: tive uma série de problemas no carregador de classes quando usei o log do apache commons, além do log4j. Era apenas para um aplicativo específico, mas achei mais simples usar o log4j sozinho, em vez de ter a flexibilidade oferecida ao usar uma camada de abstração como o log comum.

Veja este artigo para mais detalhes :

Boa sorte!

Rydell
fonte
17

O java.util.logging oferece um pacote abrangente de registros sem o excesso de bagagem que alguns outros fornecem.

Adão
fonte
5
Além disso, ele é incluído por padrão e usado por si só Java (assim você vai tê-lo de qualquer maneira!)
parou - anony-Mousse
7

O log4j é um pacote muito melhor em geral e não possui alguns dos problemas que o java.util.logging contém. Eu diria que usar o log4j diretamente é mais fácil do que usar o log comum.

Will Sargent
fonte
3
Você pode ser mais específico sobre os problemas que o java.util.logging possui?
alkber
Claro, como a sobrecarga em registrar métodos sincronizados: ver github.com/playframework/playframework/issues/6958 e bugs.openjdk.java.net/browse/JDK-8077846
Will Sargent
4

Eu recomendo usar o Apache Commmons Logging como sua interface de log. Dessa forma, você tem a flexibilidade de alternar as implementações de registro a qualquer momento, sem exigir nenhuma alteração no código.

Edmund Tay
fonte
3

Eu iria com log4j. As possibilidades do log4j não são obsoletas!

svrist
fonte