【问题标题】:A different log for every user using Log4j使用 Log4j 的每个用户都有不同的日志
【发布时间】:2010-10-06 07:37:24
【问题描述】:

我有一个网络应用程序,我想为每个用户使用不同的日志,这样我就可以了解用户在系统上所做的事情的“历史记录”。

这是我目前所拥有的:

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 并根据我正在登录的用户更改附加程序。我想我应该为每个用户创建不同的Logger,但这样对吗?

【问题讨论】:

  • 您可以拥有多少用户?
  • 在 1.000 和 10.000 之间
  • 您知道您很可能不会被允许在您的 Web 服务器日志模块中同时打开 10.000 个文件?
  • 我是。这个想法是打开、记录和关闭文件。但这就是为什么我在这里要求聆听不同的方法:)。

标签: java web-applications log4j


【解决方案1】:

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

【讨论】:

  • 这正是我一直在寻找的。谢谢!
【解决方案2】:

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

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

【讨论】:

  • 这也是一个很好的方法,我喜欢后处理的想法。为它+1。如果我也能接受你的回答,我会这样做!
【解决方案3】:

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

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

(编辑:这里是另一个关于 NDC 的有用帖子:When to use 'nested diagnostic context' (NDC)?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    相关资源
    最近更新 更多