为什么 Log4j2 JsonLayout + KeyValuePair 打印空的 logEvent 消息 [英] Why is Log4j2 JsonLayout + KeyValuePair printing empty logEvent messages

查看:61
本文介绍了为什么 Log4j2 JsonLayout + KeyValuePair 打印空的 logEvent 消息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

TL;DR如果我在 log4j2.xml 配置中使用带有嵌套 KeyValuePair 的 JsonLayout,则生成的日志消息为空.任何想法为什么?

TL;DR If I'm using JsonLayout with a nested KeyValuePair in my log4j2.xml config the resulting log messages are empty. Any ideas why?

长篇故事

我使用 Tomcat 8.5.43 和以下与日志相关的 JAR:

I'm using Tomcat 8.5.43 with the following logging related JARs:

  • jackson-annotations-2.9.7.jar
  • jackson-core-2.9.7.jar
  • jackson-databind-2.9.7.jar
  • slf4j-api-1.7.25.jar
  • jcl-over-slf4j-1.7.25.jar
  • log4j-api-2.12.0.jar
  • log4j-core-2.12.0.jar
  • log4j-jul-2.12.0.jar
  • log4j-slf4j-impl-2.12.0.jar
  • tomcat-extras-juli-8.5.2.jar(作为/bin 中的 tomcat-juli.jar)
  • tomcat-extras-juli-adapters-8.5.2.jar
  • log4j-web-2.12.0.jar(在 web 应用程序中)

和 log4j2.xml 配置:

and the log4j2.xml config:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
  <Appenders>
  <Console name="consoleappender" target="SYSTEM_OUT">
    <JsonLayout compact="true" eventEol="true" stacktraceAsString="true" locationInfo="true">
      <KeyValuePair key="foo" value="bar"/>
    </JsonLayout>
  </Console>
  <Loggers>
    <Root level="info">
      <AppenderRef ref="consoleappender" />
    </Root>
  </Loggers>
</Configuration>

在 setenv.sh 中,我将类路径设置为:

In the setenv.sh I set the classpath to:

CLASSPATH="$JAVA_HOME/lib/tools.jar\
:$CATALINA_HOME/lib/log4j-api.jar\
:$CATALINA_HOME/lib/log4j-core.jar\
:$CATALINA_HOME/lib/log4j-jul.jar\
:$CATALINA_HOME/lib/jackson-annotations.jar\
:$CATALINA_HOME/lib/jackson-core.jar\
:$CATALINA_HOME/lib/jackson-databind.jar"

并使用额外的 JVM 参数运行 Tomcat:

And run Tomcat with the additional JVM args:

-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager
-Dlog4j.configurationFile=file:log4j2.xml"

所以每个 Tomcat、JULI、Apache commons 和 Slf4j 日志最终都应该重定向到 Log4J2.

So every Tomcat, JULI, Apache commons and Slf4j logging should be redirected to Log4J2 in the end.

不幸的是,我看到的是:{"logEvent":"","foo":"bar"}

Unfortunately all I see is this: {"logEvent":"","foo":"bar"}

而不是这样:{"thread":"main","level":"INFO","loggerName":"org.apache.catalina.startup.VersionLoggerListener","message":"服务器版本:Apache Tomcat/8.5.43","endOfBatch":false,"loggerFqcn":"org.apache.logging.log4j.jul.ApiLogger","threadId":1,"source":{"class":"org.apache.juli.logging.impl.Jdk14Logger","method":"log","file":"Jdk14Logger.java","line":87},"threadPriority":5,"instant":{"epochSecond":1562919500,"nanoOfSecond":701000000}}

如果我删除 KeyValuePair 一切正常.

If I remove the KeyValuePair everything works fine as expected.

这里有什么问题?

推荐答案

我遇到了同样的问题.它与 log4j-2.12.0 有某种关系,在 2.11.2 中是可以的.

I'm experiencing the same problem. It's somehow related to log4j-2.12.0, in 2.11.2 it is OK.

这篇关于为什么 Log4j2 JsonLayout + KeyValuePair 打印空的 logEvent 消息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆