感謝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」,「東西」)設置ThreadContext並清除它,當你通過調用ThreadContext.clear()或ThreadContext.remove完成( 「關聯標識符」)
最後,我用來代替
<appender type="RollingFile">
的
<RollingFile>
元件(如上面鏈接的示例)
您使用的元素。我相信當你從log4j遷移到log4j2時,這是首選。
我找到了一個解決方案,以便您不必使用兩個路由通過使用兩個路由來切換從填充的ThreadContext鍵到空的結合處的過濾器。就像這個例子所解釋的那樣http://logging.apache.org/log4j/2.x/faq.html#separate_log_files 如果ThreadContext沒有值的話,你可以使用路由上的key屬性來創建一個被選擇的路由鍵。然後我用這條路線來引用我的主要appender。如果你設置了第二個「路由」,你根本不必使用ThreadContextMapFilter。此外,您只需要在根記錄器中使用一個appender-ref。 – Alex