我需要实现多个记录器和多个追加器。我的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
请帮忙。
您可以在配置中定义多个路由,并将值放在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都附加了所有日志消息,而不管日志级别如何,因此,例如,调试记录器仍然得到了我不想要的错误消息。如有任何投入,将不胜感激。