按用户/每个请求将日志记录分组到java servlet中

时间:2015-04-15 11:42:42

标签: java servlets logging slf4j

我有一个简单的servlet进行一些计算,并使用slf4j作为外观和一个简单的日志记录绑定器(也来自slf4j)将中间结果记录到文件中以记录到文件。这很好用,但是当多个用户同时发送请求时,他们的日志会彼此交织在一起。下面是一个显示问题的虚拟示例:来自用户alice和bob的日志记录混合起来:

log: phase1 of user alice
log: phase2 of user alice
log: phase1 of user bob
log: phase3 of user alice
log: phase2 of user bob
log: phase3 of user bob
...

如果涉及的用户数量和日志语句的复杂性增加,这真的很麻烦。

一种可能的解决方案是为每个用户创建一个日志文件,当用户X输入请求时(这可以通过我的代码检测到),将其附加到logfile X.问题是我不知道如何通过简单的日志记录来完成是可能的,如果没有,还有另一种方式吗?

2 个答案:

答案 0 :(得分:1)

您可以在某个结构中存储每个用户阶段的条目,然后在最后阶段结束时将所有阶段记录为单个日志条目,或者在/如果发生错误时立即记录。

答案 1 :(得分:1)

您可能希望查看SLF4J中的“MDC”(映射诊断上下文)类(其他日志记录框架也支持此类)。

它允许您设置自定义日志记录上下文数据,然后您可以将这些数据显示在您的消息中。

例如,你可以......

import org.slf4j.MDC;

...
    private static final USER_NAME_MDC_KEY = "USRKEY";

    servlet method {
        MDC.put(USER_NAME_MDC_KEY, user.getUserId());

        ...rest of logic...

    }

如果您设置了这样的模式......

        <PatternLayout pattern="[UID=%X{USRKEY}] %d{HH:mm} [%t] %-level %c{1} - %m%n" />

...然后日志中的每一行都包含......

[UID=<whatever has been set in the MDC>]

然后,您可以为特定用户ID GRE日志,以便为他们记录消息。

(我认为这是你想要的,我可能错了!)