簡體   English   中英

將每個用戶/每個請求的Java servlet中的日志分組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM