[英]Log4j2 using multiple appender and logger
我需要實現多個記錄器和多個追加器。 我的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的新手。 如何僅寫入所需的日志文件?
編輯:
到目前為止,這是我在log4j2.xml中所做的:
<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>
在我的Java代碼中:
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映射中,以確定該線程中的后續事件記錄到哪個日志文件。 您可以從此鏈接開始。
基本概念取決於線程上下文映射中的值,您可以將日志路由到其他文件。 例如:
<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”是您各自路由的文件路徑編輯:僅添加一個追加程序。 根據線程上下文變量,它將寫入不同的文件
<Loggers>
<Root level="info">
<AppenderRef ref="Routing" />
</Root>
</Loggers>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.