2017-04-05 104 views
0

應該將日誌邏輯放在視圖層還是服務層?請求日誌屬於哪裏?

我想服務層更有意義,因爲它是一種常見的層之下的多個不同的視圖(HTTP,RPC等)。如果日誌記錄是在視圖層完成的,那麼它必須針對每個不同的視圖執行。但是另一方面,如果所有日誌邏輯都在服務層中,那麼在視圖級別就不會記錄傳入的請求和失敗事件(例如,JWT身份驗證失敗,它將在請求永遠達到服務)。

應該在哪裏記錄發生的呢?

+0

爲什麼不能同時使用?讓應用程序配置設置確定啓用/禁用哪個日誌記錄。任何體面的日誌框架都會有這樣的配置選項。 – David

+0

我不知道,我有點像在一個位置集中記錄邏輯的想法。此外,如果日誌記錄是作爲網關服務實現的,視圖應該(理想情況下)不知道它。如果我要開始在視圖層登錄,它需要了解這個第三方日誌記錄服務器並知道如何與之通信。 – user7467314

+0

應用程序層完全不需要該依賴關係的知識。技術之間的細節可能會有所不同,但通常情況下,我的域中會有一個日誌記錄界面,所有組件都可以記錄。我的依賴倒置將爲該接口提供實現,對於使用該接口的任何給定組件來說都是未知的。我想如果你任意只想登錄一個地方,那麼你必須爲此選擇一個地方。但是,應用程序代碼和服務代碼做了非常不同的事情,並運行在非常不同的數據上,我個人希望可以選擇同時登錄。 – David

回答

0

日誌記錄是一個橫切關注點,這意味着它發生在許多層(類似於驗證)。所以,如果您覺得您需要從例如表示層 - 您只需使用一個獨立於實際實現的通用接口來完成。例如,在Java中,我們經常使用slf4j,它是底層記錄器實現的一個外觀。然而,你說得對,一個地方使用這個伐木立面通常是個好主意。通常你會記錄大多數異常,警告等,因此你將它們記錄在負責處理異常的組件中。在Spring,往往@ControllerAdvice註釋被用來標記這樣的組件(它給你的選項攔截所有控制器調用和例如在一箇中心位置處理您的例外)。另一種選擇是使用AOP程序(例如AspectJ)來記錄所有的方法/異常(但它不會允許您配置在運行時要記錄哪些消息的諫連接點)。您還可以使用事件,這是一個非常優雅的解決方案,因爲您的代碼所做的一切都是爲了引發有意義的事件,這些事件將在別處處理(例如由負責記錄所有事件的組件)。總結起來 - 記錄可能發生在每一層,但是你應該避免在你的代碼中的任何地方分散調用你的logger.log()調用,並且使用更加結構化的方法(中央異常處理類,aop或事件)。

順便說一句,這個問題是不相關的DDD,所以我覺得你應該刪除領域驅動設計的標籤。

+0

我刪除了DDD標記 –