伐木是一個橫切關注。這意味着它包含了您的架構的所有層,將它作爲單獨的庫實現是有意義的。但是,這僅僅是一個練習,因爲已經有很好的解決方案,比如Log4Net,NLog,甚至.NET自己的TraceSources。
我傾向於支持那些支持分層日誌記錄的應用程序(例如log4net)。這使得在生產系統中配置所需的跟蹤級別變得更容易。例如。您可以將MyApp.SomeNamespace
的一般跟蹤級別設置爲Warning
,但也可以將特定類型設置爲MyApp.SomeNamespace.AnInterestingClass
至Debug
。
我不確定我是否理解「使用這樣的系統的方式是什麼」部分。
您可以在任何需要的地方,在您的應用的所有圖層中,在需要它的每種方法中使用日誌記錄。我的印象是,你有一個集中的地方,所有的錯誤處理和記錄的想法,但這些是分開的事情。
它應該理想地能夠捕獲未捕獲的異常並將異常描述保存在某處。
不,不應該。記錄器寫東西到日誌,他們不處理異常。記錄不僅用於報告錯誤。您還需要記錄應用程序的執行情況和許多內部信息(但具有不同的跟蹤級別),以便在生產或事後分析中對系統進行故障排除。
您應該在哪裏找到異常?
在各級。代碼中的許多方法將處理與當前上下文相關的異常。我想你真的想知道在哪裏處理那些其他地方沒有捕獲到的異常 - 某種全能處理程序。爲此,通常最有意義的做法是在最上層,即在.exe中,或者更通常地,在包含表示應用程序本身的類型的層中。有很多方法可以做到這一點 - 從簡單地將處理程序註冊爲未處理的異常(ThreadException/UnhandledException)到HandleError/Application_Error in ASP.NET MVC,直至使用我個人不喜歡的(如大多數企業庫)的exception handling application block之類的東西。
什麼是使用傳遞記錄到類的方式?將方法/構造函數重載添加到接受像ILogger這樣的接口的項目中的所有內容是否有意義?
這取決於您的實施。看起來你想要依賴注入路徑。由於記錄器不是必需的依賴項(即它與類型的功能行爲無關,而是與實現有關),所以我寧願通過屬性注入來處理它作爲可選的依賴項,而不是通過構造函數進行處理,IMO,應該只能用於主要依賴關係 - 類型正常運行所需的依賴關係。
但是,您可能不想使用DI。那麼你需要一些其他的方式來記錄。一種選擇是討論here。
不要自己動手,使用日誌記錄應用程序塊和異常處理應用程序塊。或者做一些像http://www.postsharp.net/aspects/examples/exception-handling –
@ ta.speot.is我只是想了解實施這樣的事情背後的理論,但我會檢查出來。謝謝! – hattenn
然後,您可能想要閱讀http://en.wikipedia.org/wiki/Cross-cutting_concern,關於您的「放哪裏」的窘境。 –