2016-11-11 80 views
2

我有一個多線程應用程序,並希望每個線程都有單獨的NLog配置(dest,格式)。
我需要將每個線程數據記錄到不同的文件,因此需要在代碼中配置(分隔的dest /文件名/消息格式)。NLog多實例,如何?

我發現,我的定義不同LoggingConfiguration,每次分配它LogManager.Configuration然後得到 GetLogger()它覆蓋最後的配置並返回Logger所以只創建一個輸出單個實例。

看來我不能在NLog中有多個Logger實例!
測試我寫了以下測試代碼。

 List<Logger> Loggers = new List<Logger>(); 
     for (int i = 0; i < 10; i++) 
     { 
      var config = new LoggingConfiguration(); 

      var fileTarget = new FileTarget(); 
      config.AddTarget("file", fileTarget); 
      fileTarget.Layout = "${message}"; 
      fileTarget.CreateDirs = true; 
      fileTarget.FileName = Convert.ToString(i)+".txt"; 
      fileTarget.FileAttributes = Win32FileAttributes.ReadOnly | Win32FileAttributes.WriteThrough; 
      fileTarget.LineEnding = LineEndingMode.CRLF; 
      var rule2 = new LoggingRule("*", LogLevel.Trace, fileTarget); 
      config.LoggingRules.Add(rule2); 

      LogManager.Configuration = config; // overwrite last config 

      Loggers.Add(LogManager.GetLogger(Convert.ToString(i))); 

     } 

     for (int i = 0; i < 10; i++) 
     { 
      Loggers[i].Info("text "+ Convert.ToString(i)); // all written in single output 
     } 

所有輸出都寫在'9.txt'!
NLog Class的多重實例如何。
謝謝

回答

1

一個簡單的選擇是在文件名中使用threadid,例如,

fileTarget.FileName = "thread-${threadid}.txt"; 

您還可以創建多個目標,但不創建一個新的配置,例如這有點不常見,也不是首選。

List<Logger> Loggers = new List<Logger>(); 
    for (int i = 0; i < 10; i++) 
    { 
     //no new here, but change the current 
     var config = LogManager.Configuration; 

     var fileTarget = new FileTarget(); 
     config.AddTarget("file"+i, fileTarget); //unique name here 
     fileTarget.Layout = "${message}"; 
     fileTarget.CreateDirs = true; 
     fileTarget.FileName = Convert.ToString(i)+".txt"; 
     fileTarget.FileAttributes = Win32FileAttributes.ReadOnly | Win32FileAttributes.WriteThrough; 
     fileTarget.LineEnding = LineEndingMode.CRLF; 
     var rule2 = new LoggingRule("*", LogLevel.Trace, fileTarget); 
     config.LoggingRules.Add(rule2); 

     LogManager.Configuration = config; //update config 

     Loggers.Add(LogManager.GetLogger(Convert.ToString(i))); 

    } 

    for (int i = 0; i < 10; i++) 
    { 
     Loggers[i].Info("text "+ Convert.ToString(i)); // all written in single output 
    }