Log4j2:如何为每个用户将日志写入单独的文件? [英] Log4j2: How to write logs to separate files for each user?
本文介绍了Log4j2:如何为每个用户将日志写入单独的文件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
这是我面临的挑战:
我有一个 servlet 程序.我需要将每个用户的日志写入以该用户命名的文件夹中.像这样:
I have a servlet program. And I need to write logs for each user to the folder named after that user. Something like this:
// stores message to David folder
// /root_path/David/logfile.log
logger.error(MarkerManager.getMarker("David"), "Error happened");
// stores message to Mark folder
// /root_path/Mark/logfile.log
logger.error(MarkerManager.getMarker("Mark"), "Something is broken");
在我的示例中,我使用了标记.但我真的不知道标记是否适合这项任务.
In my example I used markers. But I don't really know whether markers appropriate for this task.
一般来说,我的 appender 应该像 RollingRandomAccessFile appender.我猜 appender 的配置必须看起来像这样:
In general my appender should behave like RollingRandomAccessFile appender. I guess config for appender must look like something like this:
<RollingRandomAccessFile name="rollingFile"
fileName="logs/{markerName ?????}/movie-db.log"
filePattern="logs/log-%d{yyyy-MM-dd}-%i.log.zip"
append="false"
immediateFlush="false"
ignoreExceptions="true">
<PatternLayout pattern="%d{ISO8601} %level{length=5} [%thread] %logger - %msg%n"/>
<Policies>
<SizeBasedTriggeringPolicy size="25 MB"/>
<TimeBasedTriggeringPolicy />
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingRandomAccessFile>
有什么想法吗?
推荐答案
感谢@Remko Popma 的回答,我弄清楚了.以下是解决方案示例:
Thanks to @Remko Popma answer I figure it out. Here is the solution example:
package com.bondarenko.tmp;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;
public class TestRouting {
private final static Logger log = LogManager.getLogger(TestRouting.class);
public static void main(String[] args) {
ThreadContext.put("logFileName", "David");
log.info("Error happened");
ThreadContext.put("logFileName", "Mark");
log.info("Something is broken");
ThreadContext.remove("logFileName");
}
}
还有 log4j.xml:
And log4j.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">
<Appenders>
<Console name="consoleAppender" target="SYSTEM_OUT">
<!--SHORT PATTERN-->
<PatternLayout pattern="%d{ABSOLUTE} %level{length=5} [%thread] %logger{1} - %msg%n"/>
<!--ROBUST PATTERN
<PatternLayout pattern="%d{ISO8601} %level{length=5} [%thread] %logger - %msg%n"/>-->
</Console>
<Routing name="RoutingAppender">
<Routes pattern="${ctx:logFileName}">
<Route>
<RollingFile name="Rolling-${ctx:logFileName}"
fileName="logs/${ctx:logFileName}"
filePattern="logs/${ctx:logFileName}.%i.log.gz">
<PatternLayout pattern="%d{ABSOLUTE} %level{length=5} [%thread] %logger{1} - %msg%n"/>
<SizeBasedTriggeringPolicy size="512" />
</RollingFile>
</Route>
<!-- By having this set to ${ctx:logFileName} it will match when filename
is not set in the context -->
<Route ref="consoleAppender" key="${ctx:logFileName}"/>
</Routes>
</Routing>
</Appenders>
<Loggers>
<Logger name="com.bondarenko.tmp" level="info" additivity="false">
<AppenderRef ref="RoutingAppender"/>
</Logger>
</Loggers>
这篇关于Log4j2:如何为每个用户将日志写入单独的文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文