Por que um usaria um dos seguintes pacotes em vez do outro?
- Java Logging
- Commons Logging
- Log4j
- SLF4j
- Logback
Por que um usaria um dos seguintes pacotes em vez do outro?
Respostas:
Em ordem cronológica de aparecimento de api (até onde eu sei):
logger.debug("The entry is {}.", entry);
//which expands effectively to
if (logger.isDebugEnabled()){
// Note that it's actually *more* efficient than this - see Huxi's comment below...
logger.debug("The entry is " + entry + ".");
}
Acho que o log em Java é confuso, inconsistente, mal documentado e especialmente aleatório. Além disso, há uma grande semelhança entre essas estruturas de registro, resultando em duplicação de esforços e confusão quanto ao ambiente de registro em que você está realmente múltiploambientes de registro de uma só vez; (por exemplo, o hibernate pode usar log4j e tomcat java.util.logging). O Apache commons destina-se a unir diferentes estruturas de registro, mas na verdade apenas adiciona mais complexidade. Se você não sabe disso com antecedência, é totalmente desconcertante. Por que minhas mensagens de log não são impressas no console, etc.? Ohh porque estou olhando os logs do Tomcat, e não o log4j. Adicionando ainda outra camada de complexidade, o servidor de aplicativos pode ter configurações de registro global que podem não reconhecer configurações locais para um aplicativo da web específico. Por fim, todas essas estruturas de registro são MUITO COMPLICADAS. Logar em Java tem sido uma bagunça desorganizada, deixando desenvolvedores como eu frustrados e confusos.
As primeiras versões do Java não tinham uma estrutura de registro integrada que levasse a esse cenário.
Há um ponto importante que não foi mencionado antes:
SLF4J (e ambos Logback e LOG4J como backend de registro) têm suporte para o chamado Contexto de Diagnóstico Mapeado (MDC, consulte javadoc e a documentação ).
Este é essencialmente um Map <String, String> thread-local que você pode usar para adicionar informações de contexto adicionais ao seu evento de registro. O estado atual do MDC é anexado a cada evento.
Isso pode ser extremamente útil se você inserir nele coisas como o nome de usuário e a URL da solicitação (no caso de um webapp). Isso pode ser feito automaticamente usando um filtro, por exemplo.
Consulte também as respostas à pergunta Quais são as melhores práticas para registrar um erro? , especialmente:
Existem alguns possíveis problemas de carregamento de classe com o Commons Logging.
O Log4J e o SLF4J foram desenvolvidos pela mesma pessoa, aprendendo com os problemas encontrados na prática com o Log4J.
No projeto da nossa empresa usamos o LOG4j e é muito fácil de usar como o Stephen mostrou no seu exemplo. Também escrevemos nossas próprias classes de padrão para LOG4j para que você possa criar seus próprios esquemas de arquivo de saída. Você pode descrever como seu arquivo de log deve ser. É possível aprimorar as classes log4j originais.
Todas as propriedades do LOG4j podem ser alteradas em um arquivo log4j.properties, para que você possa usar arquivos diferentes para projetos diferentes.
O log Java não é meu favorito, mas isso pode ser porque eu uso o log4j desde o início.
A visão geral do Commons Logging fornece o motivo de sua existência: log do código da biblioteca, quando você não tem controle sobre a estrutura de log subjacente. Muito importante para os vários projetos Apache, que serão vinculados a aplicativos externos. Talvez não seja tão importante para projetos internos de TI, onde você tem controle total.
Dito isso, escrevo para Commons Logging, assim como muitos dos outros desenvolvedores que conheço. O motivo é minimizar a bagagem mental: você pode mudar de projeto ou trabalho e não precisa aprender uma nova estrutura (desde que o novo trabalho / projeto também use CL e / ou você possa convencê-los a mudar para ele).
Além disso, há algum valor em criar seus próprios wrappers em torno de qualquer estrutura que você usar. Conforme descrito aqui , gosto de usar um objeto LogWrapper para fornecer uma string customizada (importante) e minimizar a confusão visual de instruções de registro (menos importante).
Geralmente eu usaria o padrão Log4J.
Eu usaria o Java Logging se não me importasse com a dependência do Java 1.4, mas ainda usaria o Log4J como preferência.
Eu usaria o Commons Logging se estivesse aprimorando algo que já o usasse.
Eu sugeriria a criação de uma fachada de registro fino que pode gravar em qualquer uma das estruturas de registro, ponto em que a escolha do mecanismo de apoio se torna praticamente um ponto discutível.