2016-11-11 15 views
2

私はマルチスレッドアプリケーションを持っていて、それぞれのスレッドに別々のNLog Config(dest、format)が必要です。
私は別のファイルに各スレッドのデータを記録する必要があるので、コードで設定する必要があります(dest/filename/message形式で区切ってください)。NLogマルチインスタンス、どのように?

私は毎回私が異なっLoggingConfigurationを定義し、LogManager.Configuration、それを割り当てられ、それが最後の設定を上書きするので、1つの出力のみが作成されたLoggerの単一のインスタンスを返す GetLogger()を得ることがわかりました。

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クラスのマルチインスタンスはどのようにしますか。
ありがとう

答えて

1

単純なオプションの1つは、ファイル名にthreadidを使用することです。

複数のターゲットを作成することもできますが、新しい設定を作成することはできません。これは少し珍しく、好まれていません。

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 
    } 
関連する問題