使用Log4j的每个用户的不同日志

我有一个web应用程序,我想为每个用户使用不同的日志,因此我可以拥有用户在系统上所做的“历史记录”。

这是我到目前为止:

import java.io.File; import java.io.IOException; import org.apache.log4j.DailyRollingFileAppender; import org.apache.log4j.FileAppender; import org.apache.log4j.SimpleLayout; import org.apache.log4j.Logger; public class LogManager { public Logger getLog(String username) throws IOException{ SimpleLayout layout = new SimpleLayout(); FileAppender appender = new DailyRollingFileAppender(layout, "users"+File.pathSeparator+username+File.pathSeparator+username, "'.'yyyy-MM"); // configure the appender here, with file location, etc appender.activateOptions(); Logger logger = Logger.getRootLogger(); logger.addAppender(appender); return logger; } } 

问题是,作为一个web应用程序,是multithreading的,所以AFAIK我不能一直使用RootLogger并根据我正在记录的用户更改appender。 我想我应该为每个用户创建不同的Logger ,但这是正确的吗?

尝试切换到logback (log4j的后继者)。 它带有一个SiftingAppender ,可用于根据给定的运行时属性分离(或筛选)日志记录,在您的情况下,该属性将是“userid”。 该文档包含基于用户标识分隔日志的示例。

我建议使用日志上下文信息来记录用户的任何特定操作,并将其包含在您的日志记录中。

然后,只要您需要特定用户的日志,就可以遍历单个日志文件。 如果需要拆分所有文件,请在日志旋转时执行此操作。 这种后处理比为每个用户同时保持打开文件要简单得多。

“嵌套诊断上下文”适用于这样的用例 – 您可以使用id 标记每个日志语句以标识用户(如IP地址,用户名等)

更多信息: http : //logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/NDC.html

(编辑:这里有关于NDC的另一个有用的post: 何时使用’嵌套诊断上下文’(NDC)? )