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

时间:2010-10-06 07:37:25

标签: java web-applications 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应用程序,是多线程的,所以AFAIK我不能一直使用RootLogger并根据我正在记录的用户更改appender。我想我应该为每个用户创建不同的Logger,但这是正确的吗?

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

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

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

(编辑:这里有关于NDC的另一篇有用的文章:When to use 'nested diagnostic context' (NDC)?