Vale a pena usar slf4j com log4j2

114

Não consigo decidir se devo usar slf4j ou não com log4j2. Com base em postagens online, não parece que terá qualquer impacto no desempenho, mas é realmente necessário.

Além disso, esses pontos governam a favor de log4j2:

  • SLF4J força seu aplicativo a registrar Strings. A API Log4j 2 suporta o registro de qualquer CharSequence se você quiser registrar o texto, mas também suporta o registro de qualquer objeto como está.
  • A API Log4j 2 oferece suporte para registrar objetos Message, expressões lambda Java 8 e registro livre de lixo (evita a criação de arrays vararg e evita a criação de Strings ao registrar objetos CharSequence).
Andy897
fonte
2
Talvez. E se meu servidor de aplicativos incluir um slf4jlogback (ou log4jv1)? Devo então ser forçado a instalar um terceiro logger para usar seu aplicativo? Ou talvez a segurança corporativa decida que você só pode usar java.util.loggingna produção, e então?
Elliott Frisch
Obrigado por escrever. Mas, se todos estiverem usando log4j org, o argumento acima não será válido.
Andy897
4
Usar SLF4J significa que substituir a implementação é muito fácil se a política da empresa mudar, por exemplo, quando sua empresa é adquirida e novas políticas são impostas a você. Usar SLF4J agora, ao escrever o código, não levará mais tempo do que usar Log4j diretamente. Substituir chamadas Log4j diretas posteriormente levará muito tempo. SLF4J é um investimento / seguro gratuito para o futuro. Isso é mais importante do que os recursos da API Log4j 2? Só você (ou a política da empresa) pode decidir isso.
Andreas
Existe uma maneira de usar slf4j com log4j2 se você quiser? Esta página mostra o uso com log4j - versão 1.2 - que é o fim da vida), mas nenhuma opção para log4j2. Se existe uma maneira, por que slf4j não a menciona?
J Woodchuck

Respostas:

162

Vá em frente: programe para a API log4j2 em vez de slf4j

É seguro: a API Log4j2 oferece exatamente as mesmas garantias que slf4j - e muito mais.

Agora que o próprio Log4j2 está separado em uma API e um módulo de implementação, não há mais nenhum valor em usar SLF4J.

Sim, é uma boa prática de engenharia manter suas opções abertas. Você pode querer mudar para outra implementação de log posteriormente.

Nos últimos 10 anos ou mais, construir essa flexibilidade em seu aplicativo significou usar uma API de wrapper como SLF4J. Essa flexibilidade não vem de graça: a desvantagem dessa abordagem é que seu aplicativo não pode usar o conjunto de recursos mais rico da biblioteca de log subjacente.

Log4j2 oferece uma solução que não requer que sua aplicação seja restrita ao menor denominador comum.

A válvula de escape: log4j-to-slf4j

Log4j2 inclui um log4j-to-slf4j módulo de ponte. Qualquer aplicativo codificado na API Log4j2 pode optar por alternar a implementação de apoio para qualquer implementação compatível com slf4j a qualquer momento.

log4j-to-slf4j

Conforme mencionado na pergunta, o uso da API Log4j2 oferece diretamente mais funcionalidade e tem algumas vantagens não funcionais em comparação com o uso de uma API de wrapper como slf4j:

  • API de mensagem
  • Lambdas para registro preguiçoso
  • Registre qualquer objeto em vez de apenas Strings
  • Livre de lixo: evite criar varargs ou Strings onde for possível
  • CloseableThreadContext remove automaticamente itens do MDC quando você terminar de usá-los

(Consulte 10 recursos da API Log4j2 não disponíveis no SLF4J para obter mais detalhes.)

Os aplicativos podem usar com segurança esses recursos ricos da API Log4j2 sem ficarem presos à implementação de núcleo Log4j2 nativa.

SLF4J ainda é sua válvula de segurança, apenas não significa que seu aplicativo deva codificar contra a API SLF4J.


Divulgação: Eu contribuo para Log4j2.


Atualização: parece haver alguma confusão de que a programação da API Log4j2 de alguma forma introduz uma "fachada para uma fachada". Não há diferença a esse respeito entre a API Log4j2 e SLF4J.

Ambas as APIs requerem 2 dependências ao usar uma implementação nativa e 4 dependências para uma implementação não nativa. SLF4J e a API Log4j2 são idênticos neste aspecto. Por exemplo:

As dependências necessárias são semelhantes para SLF4J e Log4j 2 API

Remko Popma
fonte
7
Compreendo. Deixe-me reformular minha pergunta. Há alguma implementação independente da API log4j2 diferente de log4j2?
Ceki
5
A API Log4j2 e impl não são "fortemente acoplados". Todas essas implementações SLF4J estão disponíveis: Um aplicativo codificado na API Log4j2 pode selecionar a log4j-to-slf4jdependência em vez de log4j-coree escolher qualquer uma dessas implementações SLF4J que você mencionou. O número de implementações nativas da API Log4j2 é irrelevante.
Remko Popma
19
O problema é que muitas vezes você tem dependências de bibliotecas que usam slf4j, então é mais fácil ficar com isso.
Davio
18
então, devo usar uma interface para uma interface para uma implementação? Sim, não, obrigado ... Slf4j venceu log4j ao fornecer uma boa interface para implementação de registro ... log4j2 deve apenas implementar slf4j api - se houver um recurso ausente, contribua de volta, se slf4j não aceitar o novo recurso, TALVEZ haja um caso para interfaces api log4j2 ....
RockMeetHardplace
4
@RemkoPopma - você ainda está contra o uso da interface log4j. Sim, entendi - posso encadear a interface do log4j2 -> a interface do slf4j -> qualquer implementação, mas prefiro não abstrair a abstração - obrigado, mas não, obrigado.
RockMeetHardplace