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:
- 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:
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?