2016-11-11 4 views
2

У меня есть приложение с несколькими потоками и вы хотите, чтобы каждый поток имел отдельный NLog Config (dest, format).
Мне нужно записывать каждый поток данных в другой файл, поэтому вам нужно настроить код (отдельный файл dest/filename/format).NLog multi instance, How?

я обнаружил, что каждый раз, когда я определил LoggingConfiguration по-другому и назначил его LogManager.Configuration, а затем получить GetLogger() его перезаписать последний конфиг и вернуть один экземпляр из Logger так создается только один выход.

Кажется, что у меня не может быть много экземпляров Logger в NLog !!!
Чтобы проверить, я написал ниже тестовый код.

 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

Один простой вариант - использовать 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 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^