为啥 Log4j2 JsonLayout + KeyValuePair 打印空的 logEvent 消息

Posted

技术标签:

【中文标题】为啥 Log4j2 JsonLayout + KeyValuePair 打印空的 logEvent 消息【英文标题】:Why is Log4j2 JsonLayout + KeyValuePair printing empty logEvent messages为什么 Log4j2 JsonLayout + KeyValuePair 打印空的 logEvent 消息 【发布时间】:2019-11-22 00:19:12 【问题描述】:

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

长篇大论

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

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 配置:

<?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 中,我将类路径设置为:

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:

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

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

不幸的是,我看到的只是这个:"logEvent":"","foo":"bar"

而不是这样的: "thread":"main","level":"INFO","loggerName":"org.apache.catalina.startup.VersionLoggerListener","message":"Server version: 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 一切正常。

这里有什么问题?

【问题讨论】:

您将在控制台上看到此消息。在控制台中,日志以摘要形式显示。如果你保存在文件而不是控制台,它会显示你写的信息。 【参考方案1】:

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

【讨论】:

这是问题的答案吗?请删除此处的评论并在原始问题下方重写 它实际上回答了这个问题。好像他们有一个ticket。

以上是关于为啥 Log4j2 JsonLayout + KeyValuePair 打印空的 logEvent 消息的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NLog JsonLayout 减少异常数据属性的输出?

Logback JsonLayout 在同一行打印所有日志

为啥 Sleuth 在我的 Spring Boot 服务中不能与 Log4j2 一起使用

为啥在 Log4j2 上使用 Slf4j 时 log4j-slf4j-impl 不依赖于 log4j-core

为啥mysql每个表只使用一个索引?

为啥我的注册表无法读取工作 vc++?