我有一个简单的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.问题是我不知道如何通过简单的日志记录来完成是可能的,如果没有,还有另一种方式吗?
答案 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日志,以便为他们记录消息。
(我认为这是你想要的,我可能错了!)