April 1, 2013

避免將NLog設定檔放在library project

為了降低NLog與web app專案間的耦合關係,我建立了一個library專案,加了一層抽象層在NLog與web app之間,而web app只需直接呼叫這個抽象層即可使用NLog所提供的API。於是在library專案中我便直接使用nuget安裝了NLog及其設定檔並完成了抽象層的設計。

就在一切設定好之後發現原本在web app直接使用NLog還能正常輸出紀錄到log檔,將相同的設定檔移到library專案後就不能運作了。嘗試將設定檔中nlog元素的throwExceptions屬性設為true,但沒有看到任何錯誤息出現。最後執行了偵錯模式發現IsDebugEnabled的值居然是false。


但設定檔內容我是原封不動從web app移過來,難道是NLog根本就沒讀取到設定檔(NLog.config)嗎?可是看了一下web app下的bin資料夾,裡面確實有看到NLog.config,所以應該是能讀取到設定檔吧?

研究了一下NLog官方文件可以推斷出設定檔應該是沒有被讀取到,以下是NLog設定檔可被讀取的位置

In case of an ASP.NET application, the following files are searched:
  • standard web application file web.config
  • web.nlog located in the same directory as web.config
  • NLog.config in application’s directory
  • NLog.dll.nlog in a directory where NLog.dll is located
  • file name pointed by the NLOG_GLOBAL_CONFIG_FILE environment variable (if defined, NLog 1.0 only - support removed in NLog 2.0)

我的web app是一個ASP.NET MVC 4專案。根據上述前三項,NLog會讀取web app目錄下的web.config、web.nlog及NLog.config,所以不會讀取到設定檔。而第4項需要設定檔的名稱為NLog.dll.nlog在bin資料夾(NLog.dll所在位置)內,而不是預設的NLog.config名稱,因此當然也讀不到。第5項就更不用說了,在NLog 2.0已經不支援了。

很明顯地,因為我的設定檔是擺在library專案內,所以解決的方式就是將NLog.config重新命名為NLog.dll.nlog。修改完後,重新編譯我的web app並執行,log檔順利寫入。

雖然重新命名設定檔名稱可以解決問題,不過並不建議這麼做。原因是參考library專案的專案可能不只web app,而web app專案也可能有兩個以上,如果各專案間對NLog.config的設定有所不同的話,很顯然就不適合將設定檔放在library專案中。最後,我在各web app專案下放置所屬的NLog.config,移除library專案中相同的設定檔。

No comments: