2013-08-07 70 views
2

我正在使用SLF4J和Log4J後端。每個動態日誌記錄類別的可插入appender?

我有獨立的Java服務,它從隊列中獲取「任務」,並在單獨的線程中執行任務(Akka Actors,如果有的話)。我想發送日誌消息到每個任務的日誌文件(因此每個任務都開始登錄到它自己的唯一日誌文件中)。

我的要求是:

  • 隱含傳遞任務ID與日誌消息
  • 選擇文件由ID
  • 記錄刪除ID,當任務結束,所以沒有後續任務可以登錄到錯誤的文件意外

到目前爲止,它看起來像我必須創建自己的日誌appender,它將「承認」任務的一些標準(這是一個很大的問題,因爲我不知道如何傳遞任務ID到因爲有些任務可能會啓動線程池/ fork-join,所以繼承線程上下文會很複雜)

您是否知道任何現有的可能適合我的日誌記錄實現?可能是Log4J的一些擴展?

回答

2

Log4J有一個沒有那麼廣爲人知的功能,可以幫助您完成任務。自己的appender方法似乎是正確的,並且可以可靠地傳遞一個ID,您可以使用映射診斷上下文(MDC)。某處,在任務ID是已知的,你可以把任務ID爲MDC:

MDC.put("id", id); 

在您的自定義的appender只是把它抓回來:

Object id = MDC.get("id"); 

主要優點MDC可以給你比較簡單ThreadLocal存儲是一種「線程繼承」。一個子線程自動繼承其父的映射診斷上下文的副本:

MDC.put("id", "1"); 
    new Thread(){ 
     @Override 
     public void run() { 
      System.out.println(MDC.get("id")); // prints 1 
     } 
    }.start(); 

有一個任務ID在自定義的appender您可以輕鬆輸出轉發到相應的文件。 SLF4J也提供MDC,但其行爲取決於底層實現。

相關問題