使用 log4j2 作为 SLF4J 后端时 EventData 消息丢失了吗?
EventData message lost with log4j2 as SLF4J backend?
我想使用 SLF4J-ext EventData 和 EventLogger 在我的业务逻辑中记录重要事件:
public void onMessage(Message message) {
EventData messageEvent = new EventData();
messageEvent.setMessage("Message arrived");
messageEvent.put("messageID", message.getJMSMessageID());
EventLogger.logEvent(messageEvent);
}
我也想用log4j2做后端。目前,这导致以下工件成为我部署的一部分:slf4j-api-1.7.12、slf4j-ext-1.7.12、log4j-api-2.3、log4j-core-2.3、 log4j-slf4j-impl-2.3、log4j-web-2.3 - 当然还有它们的依赖项。
我的 log4j2-configuration 旨在在常规文件中生成格式化条目:
[...]
<Appenders>
<RollingFile name="traceFileAppender"
fileName="${logBase}/trace.log"
filePattern="${logBase}/trace.log.%d{yyyy-MM-dd}">
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
<DefaultRolloverStrategy max="7"/>
<PatternLayout pattern="%date{ISO8601}[%thread] %level %marker %logger%nThread-Stack: %x%nThread-Map: %X%nMessage-Map: %K%nMessage: %m%n%rEx-- %n%n" />
<ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY" />
</RollingFile>
[...]
</Appenders>
<Loggers>
[...]
<Logger name="EventLogger" level="INFO" additivity="true" />
[...]
<Root level="TRACE">
<AppenderRef ref="traceFileAppender" />
[...]
</Root>
</Loggers>
[...]
但是,我的日志语句如下所示:
2015-07-31T08:13:55,589[MessageListenerThreadPool : 0] INFO EVENT EventLogger
Thread-Stack: []
Thread-Map: {}
Message-Map: {messageID=ID:c3e2d840d4d8d4f14040404040404040cf522d11eb57d22b}
Message:
--
我错过了什么?
log4j-slf4j-impl 模块converts slf4j EventData 对象到 log4j2 StructuredMessage。输出显示消息ID,证明本次转换成功。
但是,输出不显示该消息。看起来这是由于 StructuredMessage.toString() 实施。乍一看,似乎无法通过使用 %K{key}
转换说明符为消息部分指定键来自定义它...:-(
我想使用 SLF4J-ext EventData 和 EventLogger 在我的业务逻辑中记录重要事件:
public void onMessage(Message message) {
EventData messageEvent = new EventData();
messageEvent.setMessage("Message arrived");
messageEvent.put("messageID", message.getJMSMessageID());
EventLogger.logEvent(messageEvent);
}
我也想用log4j2做后端。目前,这导致以下工件成为我部署的一部分:slf4j-api-1.7.12、slf4j-ext-1.7.12、log4j-api-2.3、log4j-core-2.3、 log4j-slf4j-impl-2.3、log4j-web-2.3 - 当然还有它们的依赖项。
我的 log4j2-configuration 旨在在常规文件中生成格式化条目:
[...]
<Appenders>
<RollingFile name="traceFileAppender"
fileName="${logBase}/trace.log"
filePattern="${logBase}/trace.log.%d{yyyy-MM-dd}">
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
<DefaultRolloverStrategy max="7"/>
<PatternLayout pattern="%date{ISO8601}[%thread] %level %marker %logger%nThread-Stack: %x%nThread-Map: %X%nMessage-Map: %K%nMessage: %m%n%rEx-- %n%n" />
<ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY" />
</RollingFile>
[...]
</Appenders>
<Loggers>
[...]
<Logger name="EventLogger" level="INFO" additivity="true" />
[...]
<Root level="TRACE">
<AppenderRef ref="traceFileAppender" />
[...]
</Root>
</Loggers>
[...]
但是,我的日志语句如下所示:
2015-07-31T08:13:55,589[MessageListenerThreadPool : 0] INFO EVENT EventLogger
Thread-Stack: []
Thread-Map: {}
Message-Map: {messageID=ID:c3e2d840d4d8d4f14040404040404040cf522d11eb57d22b}
Message:
--
我错过了什么?
log4j-slf4j-impl 模块converts slf4j EventData 对象到 log4j2 StructuredMessage。输出显示消息ID,证明本次转换成功。
但是,输出不显示该消息。看起来这是由于 StructuredMessage.toString() 实施。乍一看,似乎无法通过使用 %K{key}
转换说明符为消息部分指定键来自定义它...:-(