log4j2没有写入日志文件

时间:2014-12-19 16:46:12

标签: java routing log4j2 rollingfileappender

我想使用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");
    }
}

这会根据上下文正确创建文件。但是在日志文件中什么都不写。

1 个答案:

答案 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"),因为这是您在配置文件中指定的唯一命名记录器。