2016-07-05 42 views
1

我試圖從多個Web應用程序要使用的「公共」類庫中執行一些非常特定的日誌記錄。 「消費」網絡應用程序可能會或可能不會做一些NLog自己的日誌記錄。我想以某種方式隔離日誌記錄配置,以便:當使用文件和編程NLog配置時,將日誌記錄器僅輸出到特定目標

  • 從類庫的任何記錄不會通過消費web應用
  • 從消費Web應用程序的任何記錄不會配置目標結束由類庫

到目前爲止,我已經從類庫管理設置日誌記錄配置程序,以便它可以「共存」從一個消費Web應用程序的日誌記錄配置中配置的目標而告終。我做了這樣的事情:

public static void RegisterLoggingConfiguration() 
{ 
    // If there is existing configuration then just use that and update it. Otherwise, create brand new config. 
    var config = LogManager.Configuration ?? new LoggingConfiguration(); 

    var specialTarget = new FileTarget { FileName = @"C:\Logs\SpecialLog.txt" }; 
    config.AddTarget("specialTarget", specialTarget); 

    var specialRule = new LoggingRule("SpecialLoggerName", LogLevel.Info, specialTarget) { Final = true }; 
    config.LoggingRules.Add(specialRule); 

    LogManager.Configuration = config; 
} 

的關鍵是,我的名字針對一個特定的記錄,使得其輸出可以對特定文件的目標指向。例如,某個地方在我的類庫:

var logger = LogManager.GetLogger("SpecialLoggerName"); 

正由這條線從編程配置上面的名稱匹配:

var specialRule = new LoggingRule("SpecialLoggerName", LogLevel.Info, specialTarget) { Final = true }; 

到目前爲止好。但是,問題在於,當一個耗費的Web應用程序有自己的日誌記錄設置並使用一個全面的日誌記錄器時,它也會捕獲我特殊的日誌記錄器輸出。就像這樣:

<logger name="*" minlevel="Info" writeTo="someLogfile" /> 

我想這是因爲程序的日誌記錄配置結束了在記錄器的現有列表的末尾添加「特殊目標」,所以整個「最終= true」不會真正幫助。乍一看,我沒有找到一種方法來在特定索引處添加目標。但如果有人有辦法做到這一點,請讓我知道。

或者如果任何人有關於如何從共同類庫內部隔離日誌的其他想法,請讓我知道。

回答

1

啊,我覺得很蠢!原來有在特定的指數,我錯過了插入一個規則,一個簡單的辦法:

//config.LoggingRules.Add(specialRule);  // old way 
config.LoggingRules.Insert(0, specialRule); // new way 

我把重點放在LoggingRules.Add(...)沒有一種方法來指定一個索引太多了,我完全錯過了有一個Insert(int index, LoggingRule item)方法。

我希望這有助於別人在一天內尋找類似的東西。

+0

有完全相同的問題,這固定它! – Lareau

相關問題