感谢 hveiga 跟进并发布您的解决方案,这很有帮助。我想说您可以通过添加第二个“路由”来避免您的过滤器解决方案,该“路由”路由所有对您的路由键没有值的消息,如下所述:http: //logging.apache.org/log4j/2.x/faq。 html#separate_log_files
所以你更新的 log4j 配置看起来像这样。
<appenders>
<appender name="applicationAppender" type="RollingFile" fileName="${logFileName}" filePattern="${logFileNamePattern}" bufferedIO="true" immediateFlush="true" append="true">
<layout type="PatternLayout" pattern="${logPattern}" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="${logFileSize}" />
</Policies>
<DefaultRolloverStrategy max="${logFileCount}" />
</appender>
<Routing name="contextSpecificAppender">
<Routes pattern="$${ctx:contextId}">
<Route>
<appender name="Rolling-${ctx:contextId}" type="RollingFile" fileName="logs/${ctx:contextId}.log" filePattern="${logFileNamePattern}" bufferedIO="true" immediateFlush="true" append="true">
<layout type="PatternLayout" pattern="${logPattern}" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="${logFileSize}" />
</Policies>
<DefaultRolloverStrategy max="${logFileCount}" />
</appender>
</Route>
<Route ref="applicationAppender" key="$${ctx:contextId}">
</Route>
</Routes>
</Routing>
</appenders>
<loggers>
<root level="info">
<appender-ref ref="contextSpecificAppender"/>
</root>
</loggers>
在您的应用程序中,您可以通过调用 ThreadContext.put("contextId", "something") 设置 ThreadContext 并在完成后通过调用 ThreadContext.clear() 或 ThreadContext.remove("contextId") 清除它
最后,我使用了
<RollingFile>
元素(如上面链接的示例)而不是
<appender type="RollingFile">
你使用的元素。我相信当您从 log4j 迁移到 log4j2 时,这是首选。