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.

loader-dentro-do-projeto

Agora faça as modificações no arquivo Loader.java conforme instruções abaixo:

  • Comente o código conforme a imagem:

diff1

  • O método isJava1() deve sempre retornar true
  • Os locais que referenciam a variável java1 devem passar a chamar o método isJava1()

Agora o MDC vai aparecer no log.

Referências