我想使用log4j2来满足我的应用需求。 我在ThreadContext中使用RollingAppender和变量。
这是我的log4j2.xml
<Configuration>
<Appenders>
<Routing name="RoutingAppender">
<Routes pattern="$${ctx:FlowName}">
<Route>
<RollingFile name="Audit-${ctx:FlowName}"
fileName="logs/Audit-${ctx:FlowName}.log"
filePattern="logs/Audit-${ctx:FlowName}.%i.log.gz"
immediateFlush="true">
<PatternLayout>
<pattern>"%m%n"<pattern/>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="6" modulate="true" />
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
</RollingFile>
</Route>
</Routes>
</Routing>
</Appenders>
<Loggers>
<Root level="trace">
<appender-ref ref="RoutingAppender" level="info"/>
</Root>
<Logger name="AuditNippin" level="info" >
<AppenderRef ref="myRoutingAppender"/>
</Logger>
</Loggers>
</Configuration>
这是java代码:
package be.myApp;
public class myClass{
private static final org.apache.logging.log4j.core.Logger AUDITLOGGER =
(org.apache.logging.log4j.core.Logger) org.apache.logging.log4j.LogManager.getLogger("myRoutingAppender");
public void doSomething(){
ThreadContext.put("FlowName", "MyFlow");
AUDITLOGGER.info("coucou");
ThreadContext.remove("FlowName");
}
}
这会根据上下文正确创建文件。但是在日志文件中什么都不写。
答案 0 :(得分:1)
首先,您的log4j2 XML中存在语法问题:
&lt; pattern /&gt;
这应该是</pattern>
&lt; AppenderRef ref =&#34; myRoutingAppender&#34; /&GT;
这应该是:<AppenderRef ref="RoutingAppender" />
此外,由于您使用的是TimeBased
触发策略,因此您的RollingFile
appender的filePattern中必须包含日期模式。请参阅documentation for RollingFileAppender。
最后,您可能不希望在PatternLayout:
的模式中引用&lt;模式&GT;&#34;%米%N&#34;&lt;图案/&GT;
你可能意味着:<pattern>%m%n<pattern/>
修复上述所有内容之后,您应该在日志文件中看到日志,但这只是因为它会在以下代码运行时获得根记录器:
LogManager.getLogger(&#34; myRoutingAppender&#34);
由于您没有具有该名称的记录器,因此它将获取将使用路由追加器并写入日志文件的根记录器。我猜您打算调用getLogger("AuditNippin")
,因为这是您在配置文件中指定的唯一命名记录器。