2013-01-01 36 views
0

我有一個Java服務器(基於Socket.IO for Java,但這不是問題的一部分),它接受來自Web客戶端的請求,進行一些計算,並將結果發回給客戶。將特定函數調用記錄到特定日誌

服務器使用一些庫,使用log4j進行日誌記錄。

由於計算時間長,我想發送給客戶端,不僅是最終結果,還有日誌。

當然,我想發送每個客戶端,只有與其請求相關的日誌行。

所以,我的問題是:如何配置log4j,使特定函數調用期間生成的所有日誌都轉到特定的記錄器?

+0

這聽起來並不可能,因爲Log4J的將不能提前知道的文件描述符,它必須寫日誌。它看起來只能以編程方式完成,但是log4j API也有相應的工具。 – fge

+0

好的,那麼我怎樣才能以編程方式執行此操作,同時讓我的應用程序保持多線程? –

回答

3

是的,它的可能性。 1您需要熟悉MDC(映射診斷上下文)的概念 - 基本上它是一個每線程日誌記錄上下文(讀取hashmap),您可以在其中存儲內容。 可以將log4j配置爲根據MDC值將日誌記錄輸出發送到不同的目標 - 這樣您可以將每個用戶的日誌輸出發送到以用戶命名的文件。所以當你開始長操作時,你要做的就是在MDC中設置用戶名(或者一些標識符),所有操作的日誌都會進入一個特定的位置(文件,取決於配置的記錄器),然後清除MDC當操作完成時。

有一個2部分教程使用MDC herehere
理想我想也寫我自己的log4j記錄器用於此目的,正如這裏建議:Using MDC in log4j to dynamically name the log file

+0

「在啓動長操作時在MDC中設置用戶名(或某個標識符),操作的所有日誌都將進入特定位置(文件,取決於配置的記錄器),然後在操作完成時清除MDC 「 但這意味着我不能並行運行兩個實例(在兩個工作線程中)? –

+1

當然你可以 - MDC是線程本地的,所以如果你有2個TX發生在2個不同的用戶上,那麼日誌記錄將會轉到不同的文件。 如果您希望單個TX(針對單個用戶)執行線程化,則需要將MDC帶到您創建的每個新線程。如果你想在同一個用戶下並行(不相關)2+ TX,你需要在MDC中放入用戶+一些唯一的TX ID並編寫你自己的appender,它不僅可以按用戶值分組輸出,還可以按用戶+ tx id – radai

+0

完美地工作,謝謝! –

相關問題