当前位置: 首页 > 知识库问答 >
问题:

使用多个appender和logger的Log4j2

夏侯涵映
2023-03-14

我需要实现多个记录器和多个追加器。我的log4j2.xml如下所示:

  <Appenders>
  <RollingFile name="SYSTEM_LOGGER"
                 fileName="${logging.folder}System.log"
                 filePattern="${ARCHIVE}System.log.%d{dd MMM yyyy HH:mm:ss.SSS}.gz">
        <PatternLayout>
        <Pattern>${PATTERN}</Pattern>
        </PatternLayout>
        <Policies>
            <TimeBasedTriggeringPolicy interval="10" modulate="true"/>
            <SizeBasedTriggeringPolicy size="4 MB" />
            <DefaultRolloverStrategy max="50"/>             
        </Policies>
    </RollingFile>
<Appenders>
<RollingFile name="COMMONREQ_LOGGER"
                 fileName="${logging.folder}/CommonReq.log"
                 filePattern="${ARCHIVE}/CommonReq.log.%d{dd MMM yyyy HH:mm:ss.SSS}.gz">
        <PatternLayout>
        <Pattern>${PATTERN}</Pattern>
        </PatternLayout>
        <Policies>
            <TimeBasedTriggeringPolicy interval="10" modulate="true"/>
            <SizeBasedTriggeringPolicy size="4 MB" />
            <DefaultRolloverStrategy max="50"/>             
        </Policies>
    </RollingFile>
<Appenders>
<RollingFile name="COMMONRES_LOGGER"
                 fileName="${logging.folder}/CommonRes.log"
                 filePattern="${ARCHIVE}/CommonRes.log.%d{dd MMM yyyy HH:mm:ss.SSS}.gz">
        <PatternLayout>
        <Pattern>${PATTERN}</Pattern>
        </PatternLayout>
        <Policies>
            <TimeBasedTriggeringPolicy interval="10" modulate="true"/>
            <SizeBasedTriggeringPolicy size="4 MB" />
            <DefaultRolloverStrategy max="50"/>             
        </Policies>
    </RollingFile>
  <Loggers>
    <Root level="INFO">
        <AppenderRef ref="SYSTEM_LOGGER"/>
        <AppenderRef ref="COMMONREQ_LOGGER"/>
        <AppenderRef ref="COMMONRES_LOGGER"/>
</Root>
</Loggers>

现在,当我使用这个xml执行代码时,日志被写入最后一个日志文件commonres.log。我是Log4J的新手。如何只写入所需的日志文件?

编辑:

  <Routing name="Routing">
  <Routes pattern="$${ctx:ROUTINGKEY}"> 
  <Route key="$${ctx:ROUTINGKEY}" >
  <RollingFile name="SYSTEM_LOGGER"
                 fileName="${logging.folder}/$${ctx:ROUTINGKEY}.log"
                 filePattern="${ARCHIVE}/$${ctx:ROUTINGKEY}.log.%d{dd MMM yyyy HH:mm:ss.SSS}.gz">
         <PatternLayout>
         <Pattern>${PATTERN}</Pattern>
         </PatternLayout>
         <Policies>
             <TimeBasedTriggeringPolicy interval="10" modulate="true"/>
             <SizeBasedTriggeringPolicy size="4 MB"/>
             <DefaultRolloverStrategy max="50"/>                
         </Policies>
     </RollingFile>
 </Route>
 </Routes>
 </Routing>
<Loggers>
    <Root level="INFO">  
        <AppenderRef ref="Routing" />
    </Root>
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    logger = LogManager.getLogger(request.getPathInfo().replace("/", ""));
...
if(logger.getLevel() != null){
                    ThreadContext.put("ROUTINGKEY",  request.getPathInfo().replace("/", ""));

logger.info(contents);                                      
                    } 
  }
ERROR Unknown object "Routing" of type org.apache.logging.log4j.core.appender.routing.RoutingAppender is ignored.
ERROR Unable to locate appender Routing for logger  

请帮忙。

共有1个答案

严兴旺
2023-03-14

您可以在配置中定义多个路由,并将值放在ThreadContext映射中,以确定该线程中的后续事件记录到哪个日志文件。这个链接是您可以从那里开始的。

基本概念是,根据threadcontext映射中的值,您可以将日志路由到不同的文件。例如:

<Routing name="Routing">
        <Routes pattern="$${ctx:variable}"> 
            <!-- This route is chosen if thread context has no value for key 'variable' -->
            <Route key="$${ctx:variable}">
                <RollingFile name="Rolling-default" fileName="default.log"
                             filePattern="./logs/${date:yyyy-MM}/default-%d{yyyy-MM-dd}-%i.log.gz">
                    <PatternLayout>
                        <pattern>%d{ISO8601} [%t] %p %c{3} - %m%n</pattern>
                    </PatternLayout>
                    <Policies>
                        <TimeBasedTriggeringPolicy interval="6" modulate="true" />
                        <SizeBasedTriggeringPolicy size="10 MB" />
                    </Policies>

                </RollingFile>
            </Route>

            <!-- This route is chosen if thread context has some value for key 'variable' -->       
            <Route>
                <File name="variable-${ctx:variable}" fileName="other.log">

                </File>
            </Route>
        </Routes>
    </Routing> 

filename=“default.log”和filename=“other.log”是您各自路由的文件路径编辑:只添加一个appender。根据线程上下文变量,它将写入不同的文件

<Loggers>
    <Root level="info">
        <AppenderRef ref="Routing" />
    </Root>
</Loggers>
 类似资料:
  • 当我尝试向远程Linux syslog写入一些消息时,我使用log4j2和appender syslog和format=rfc5424以及bsd.,我的配置文件如下: 当我运行一个测试程序时,我总是得到如下错误:原因:java.lang.IllegalArgumentException:在org.apache.logging.log4j.message.structuredDataid没有提供结构

  • 我使用JBoss 6,在这个JBoss上部署了两个项目,它们有不同的网络上下文。他们都在后台使用Hibernate和相同的核心包,但我想根据网络上下文区分日志文件。因为核心包是相同的java包为两个项目。 我在互联网上也搜索了log4j手册,但找不到任何方法?

  • 我有一个appender文件,并希望将org.springframwork和ch.qos.logback定向到这个日志文件。但是,当我在linux服务器上运行我的应用程序时,这两个包的INFO消息并没有进入日志文件,而是直接打印出来。以下是我的logback.xml: 08:23:22,446-ch.qos.logback.classic.joran.joranConfigurator@1b83c

  • 问题内容: 我有以下要模拟的Logger,但要验证是否正在调用日志条目,而不是内容。 我想模拟用于LoggerFactory.getLogger()的任何类,但是我找不到如何做到这一点。到目前为止,这是我最终得到的结果: 我想知道: 我可以模拟静态模型以用于任何课程吗? 我只能似乎运行的,因此我似乎无法改变每个方法的特点。有没有解决的办法? 编辑结果: 我以为我已经尝试过了,但没有成功: 但是,谢

  • 我想动态地创建一个appender并将其添加到记录器中。然而,这似乎不可能使用slf4j。我可以将我的appender添加到log4j记录器中,但是我无法使用slf4j LoggerFactle检索记录器。 我想做的是:创建一个测试类(而不是jUnit测试),并在构造函数中传递一个记录器,供测试类使用。测试类的每个实例都需要自己的记录器和appender来保存日志,以便以后在HTML报告中使用。

  • 在发布这个问题之前,我已经做了我的研究,关于我没有正确使用additivity属性的问题,下面是我的log4j2.xml的一个片段,我试图实现的是,在记录器中定义的每个appender ref应该只附加它所定义级别的日志,但是所有的appender都附加了所有日志消息,而不管日志级别如何,因此,例如,调试记录器仍然得到了我不想要的错误消息。如有任何投入,将不胜感激。