Pergunta

Por que um usaria um dos pacotes a seguir em vez do outro?

  • Loging Java
  • Loging Commons
  • Log4j
  • Slf4j
  • Logback
Foi útil?

Solução

Em ordem cronológica da API Apperância (até onde eu sei):

  • Log4j porque quase todo mundo usa (na minha experiência)
  • O registro do Commons porque os projetos de código aberto o usam (para que eles possam se integrar a qualquer estrutura de registro que seja usada na solução integrada); Especialmente válido se você é um API/Framework/OSS e confia em outros pacotes que usam o log do Commons.
  • O registro do Commons porque você não deseja "bloquear" em uma estrutura de registro específica (então, em vez disso, você bloqueia o que o registro do Commons oferece a você) - não acho sensato decidir usar esse ponto como o motivo.
  • Java Logging porque você não deseja adicionar um frasco extra.
  • SLF4J porque é mais novo que o registro do Commons e fornece log parametrizado:

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 + "."); 
}
  • Logback porque é mais recente que o log4j e novamente, suporta o log parametrizado, pois implementa diretamente o SLF4J
  • Slf4j/Logback porque está escrito pelo mesmo cara que fez Log4J, então ele tornou melhor (de acordo com Ken g - obrigado. Parece se encaixar ao olhar para suas postagens anteriores)
  • SLF4J porque eles também publicam um adaptador LOG4J para que você não precise "alternar" o log4j no código mais antigo - basta fazer com que o log4j.properties use Slf4j e sua configuração

Outras dicas

Acho que o registro de Java é confuso, inconsistente, pouco documentado e especialmente aleatório. Além disso, há uma enorme quantidade de semelhança entre essas estruturas de registro, resultando em duplicação de esforço e confusão sobre o ambiente de madeira em que você está realmente. Em particular, se você estiver trabalhando em uma pilha de aplicativos da Web grave, você está frequentemente em múltiplo ambientes de log de uma vez; (Por exemplo, o hibernato pode usar log4j e tomcat java.util.logging). O Apache Commons pretende preencher diferentes estruturas de registro, mas realmente adiciona mais complexidade. Se você não sabe disso antes do tempo, é totalmente desconcertante. Por que minhas mensagens de log não estão imprimindo para o console, etc.? Ohh porque estou olhando para os logs do Tomcat, e não o LOG4J. Adicionando mais uma camada de complexidade, o servidor de aplicativos pode ter configurações globais de registro 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. O registro de Java tem sido uma bagunça desorganizada, deixando desenvolvedores como eu frustrados e confusos.

As primeiras versões do Java não possuíam uma estrutura de log integral levando a esse cenário.

Há um ponto importante que não foi mencionado antes:

SLF4J (e Logback e Log4J como back -end de log) têm suporte para um contexto de diagnóstico mapeado (MDC, veja Javadoc e documentação).

Este é essencialmente um mapa local de roscau003CString,String> que você pode usar para adicionar informações de contexto adicionais ao seu evento de registro. O estado atual do MDC está anexado a todos os eventos.

Isso pode ser incrivelmente útil se você colocar coisas como o nome de usuário e o URL da solicitação (em caso de um webApp) nele. Isso pode ser feito automaticamente usando um filtro, por exemplo.

Veja também respostas para a pergunta Quais são as melhores práticas para registrar um erro?, especialmente:

  • Existem alguns problemas em potencial de carga de classe com o registro do Commons.

  • Log4J e SLF4J foram desenvolvidos pela mesma pessoa, aprendendo com questões encontradas na prática com o log4j.

Em nosso projeto da empresa, usamos o Log4J e é muito fácil de usar como Stephen mostrou em seu exemplo. Também escrevemos nossas próprias classes de padrões para o 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 log4j que você pode alterar em um arquivo log4j.properties, para que você possa usar arquivos diferentes para projetos diferentes.

O log de Java não é o meu favor, mas isso pode ser porque eu uso o LOG4J desde o início.

o Visão geral do registro do Commons Dá o motivo de sua existência: o log do código da biblioteca, quando você não tem controle sobre a estrutura de registro subjacente. Muito importante para os vários projetos do Apache, que serão vinculados a aplicativos externos. Talvez não seja tão importante para projetos internos de TI, onde você tem controle completo.

Dito isto, escrevo para o registro do Commons, assim como muitos dos outros desenvolvedores que conheço. O motivo é minimizar a bagagem mental: você pode alterar projetos ou trabalhos e não precisar aprender uma nova estrutura (desde que o novo emprego/projeto também use CL e/ou você possa convencê -los a se mudar para ela).

Além disso, há algum valor para criar seus próprios invólucros em torno de qualquer estrutura que você use. Como descrito aqui, Eu gosto de usar um objeto LogWrapper para fornecer stringificação personalizada (importante) e minimizar a desordem visual das instruções de registro (menos importante).

Geralmente, eu padrão o uso do LOG4J.

Eu usaria o Logging Java se não me importe com uma dependência do Java 1.4, mas ainda usaria o Log4J em preferência.

Eu usaria o registro do Commons se estivesse aprimorando algo que já o usava.

Eu sugeriria criar uma fachada fina de madeira que possa escrever em qualquer uma das estruturas de registro; nesse momento, a escolha do motor de apoio se torna praticamente um ponto discutível.

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