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).
slf4j
logback (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 usarjava.util.logging
na produção, e então?Respostas:
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.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:
(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:
fonte
log4j-to-slf4j
dependência em vez delog4j-core
e escolher qualquer uma dessas implementações SLF4J que você mencionou. O número de implementações nativas da API Log4j2 é irrelevante.