2014-05-12 59 views
0

我需要在客戶端服務器程序中使用logback,對於每個到服務器的請求,它都會創建一個新的服務,它將在單獨的線程中運行。我需要記錄服務執行期間發生的操作。但我不想爲每個服務線程生成單獨的記錄器對象。我知道一種解決方案是將記錄器對象設置爲靜態。所以它不會被實例每次但有這類問題的任何標準溶液。波紋管是從我的源代碼中的一些代碼段:在客戶端服務器程序中使用logback

服務器類爲每個請求創建一個單獨的線程servcie:

1:特異於服務器類的記錄器。

2:對於服務器的每個輸入請求,我們生成一個新的線程(服務類的新實例),但問題是我們不想爲每個服務實例設置一個記錄器實例(我想它是一個!不好的做法)

這裏是服務類:

enter image description here

*:記錄是指靜態的,所以它不會被實例爲每個服務類實例:

+0

這將是一個更容易讓我們來幫助你,如果你發佈的代碼[降價格式(http://stackoverflow.com/help/formatting),而不是屏幕截圖,我們可以複製/粘貼編輯到我們的答案等 – durron597

回答

2

我知道,一個解決辦法是設置Logger對象爲靜態的,所以它不會被實例每次但有這類問題的任何標準溶液。

這是我在我的應用程序做。它效果很好。

我的很多班級都有這樣的作爲第一行:

public class SomeClass { 
    private static final Logger LOG = LoggerFactory.getLogger(SomeClass.class); 

    // the rest of the class 
} 

Also, if you want the log messages to reflect which overall request is the one doing the logging, you should use MDC:

之一的logback的設計目標是審覈和調試複雜的分佈式應用程序。大多數真實世界的分佈式系統需要同時處理多個客戶端。在這種系統的典型多線程實現中,不同的線程將處理不同的客戶端。區分一個客戶端與另一個客戶端的日誌記錄輸出的一種可能的但有點阻礙的方法包括爲每個客戶端實例化一個新的單獨的記錄器。這種技術促進了伐木工人的泛濫,並可能增加他們的管理開銷。

閱讀整個鏈接,它比我所能做的更好地解釋MDC。

+0

我用這個解決方案太(我的意思是定義靜態記錄器)我還用MDC(它是顯示在問題),但我的問題是,爲什麼你還用final關鍵字。 –

+0

@ user3593084因爲它總是相同的'Logger',創建類實例化時。 – durron597

+0

@ user3593084當然,但我[總是在我知道不會更改的字段中使用'final'](http://stackoverflow.com/questions/6827495/always-use-final) – durron597