Java 使用Log4j的每个用户都有一个不同的日志

Java 使用Log4j的每个用户都有一个不同的日志,java,web-applications,log4j,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

我有一个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应用程序,它是多线程的,所以我不能一直使用
RootLogger
,并根据我记录的用户来更改appender。我认为我应该为每个用户创建不同的
记录器,但这是否正确?

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

然后,每当您需要某个特定用户的日志时,都可以浏览单个日志文件。如果需要拆分所有文件,请在日志旋转时进行拆分。这种后处理将比同时为每个用户保留一个打开的文件要简单得多。

嵌套诊断上下文”用于这种用例-您可以在每个日志语句上标记一个标识用户的id(如IP地址、用户名等)

详情如下:


(编辑:这里是NDC上另一篇有用的帖子:)

尝试切换到(log4j的继任者)。它附带了一个可用于根据给定的运行时属性(在您的情况下为“userid”)分离(或筛选)日志记录的。包含一个基于userid分离日志的示例

您可以有多少用户?在1.000和10.000之间您知道您很可能不被允许在web服务器日志模块中同时打开10.000个文件吗?我知道。其想法是打开、记录和关闭文件。但这就是为什么我在这里要求,倾听不同的方法:)。这正是我想要的。谢谢这也是一个很好的方法,我喜欢后处理的想法+我同意。如果我也能接受你的回答,我会做的!