[英]Group the logging inside a java servlet per user / per request
我有一個簡單的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輸入一個請求時(我的代碼可以檢測到該請求),將其追加到日志文件X中。問題是我看不到如何簡單地執行此操作記錄。 有可能,如果沒有,還有其他方法嗎?
您可以將每個用戶階段的條目存儲在某種結構中,然后在上一個階段結束時或在發生錯誤時(如果發生錯誤)立即將所有階段記錄為單個日志條目。
您可能需要查看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的日志進行GREP,以便只為他們記錄消息。
(我認為這是您想要的,我可能錯了!)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.