Log4j1 - MDC não funciona no Java 9+

O MDC do Log4j1 não aparece no log no Java 9+.
O Log4j1 precisa saber a versão do Java para decidir se a feature de MDC (Mapped Diagnostic Context) pode ser utilziada ou não. No Java v1 não era possível usar essa feature.
O Java a partir da versão 9 mudou a lei de formação do número da versão e isso fez a classe org.apache.log4j.helpers.Loader do Log4j1 detectar erroneamente a versão do Java.
Uma JVM com versão 17-ea
que é versão 17, é detectada como versão 1. Exemplo de jvm que tem versão 17-ea: docker run -it --rm openjdk:17-jdk-alpine java -version
.
Algumas soluções
- Atualizar para o Log4j2
- Utilizar o Logback, que é outro provedor de log que dá suporte ao MDC
- Sobrescrever fisicamente a classe
org.apache.log4j.helpers.Loader
se sua versão do Java for posterior a 1 (vamos focar nessa)
Solução: sobrescrever fisicamente a classe org.apache.log4j.helpers.Loader
Se por qualquer motivo você não puder trocar a versão do log4j1 ou mesmo mudar para outro provedor de log, é possível substituir a classe org.apache.log4j.helpers.Loader
colocando-a no seu projeto no mesmo pacote de origem dela.
Agora faça as modificações no arquivo Loader.java
conforme instruções abaixo:
- Comente o código conforme a imagem:
- O método
isJava1()
deve sempre retornartrue
- Os locais que referenciam a variável
java1
devem passar a chamar o métodoisJava1()
Agora o MDC vai aparecer no log.