2016-10-21 7 views
1

Моя C# программа имеет под NLog.config:установить атрибут WriteTo из Logger в NLog во время выполнения

<?xml version="1.0" encoding="utf-8" ?> 
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd" 
     autoReload="true" 
     throwExceptions="false" 
     internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log"> 
    <targets> 
    <target xsi:type="File" name="file1" fileName="file1.log" layout="${message}" /> 
    <target xsi:type="File" name="file2" fileName="file2.log" layout="${message}" /> 
    <target xsi:type="File" name="file3" fileName="file3.log" layout="${message}" /> 
    <target xsi:type="File" name="file4" fileName="file4.log" layout="${message}" /> 
    <target xsi:type="File" name="file5" fileName="file5.log" layout="${message}" /> 
    <target xsi:type="File" name="file6" fileName="file6.log" layout="${message}" /> 
    </targets> 
    <rules> 
    <logger name="logger1" minlevel="Debug" writeTo="file1" />  
    </rules> 
</nlog> 

Моя программа должна регистрировать сообщения в различных наборах файлов журналов в соответствии пользователя конфигурации, например, иногда пишут на «file1, file2» и иногда записывать в «file2, file3, file4».

Итак, можно ли настроить атрибут «writeTo» в «logger1» во время выполнения в соответствии с настройками пользователя?

Большое спасибо.

ответ

0

Если вы хотите написать несколько файлов, вы можете просто использовать запятую для атрибута «writeTo» в Rule как «file1, file2, file3». Есть 6 целей, и правило говорит о записи в 3 файла, поэтому файл file1, file2 и файл 3 будут рассмотрены для ведения журнала.

Но вам нужно сделать это во время выполнения. Ниже приведен код C#.

 Console.Out.WriteLine("Logget started"); 
     Console.Out.WriteLine(""); 

     Logger logger = LogManager.GetCurrentClassLogger(); 
     var config = new LoggingConfiguration(); 


     //Define targets 
     var fileTarget = new FileTarget(); 
     config.AddTarget("file7", fileTarget); 

     var fileTarget2 = new FileTarget(); 
     config.AddTarget("file8", fileTarget); 

     // Set target properties 
     fileTarget.FileName = "file7.log"; 
     fileTarget.Layout = "${message}"; 
     fileTarget2.FileName = "file8.log"; 
     fileTarget2.Layout = "${message}"; 

     // Define rules 
     var rule1 = new LoggingRule("*", LogLevel.Debug, fileTarget); 
     config.LoggingRules.Add(rule1); 

     var rule2 = new LoggingRule("*", LogLevel.Debug, fileTarget2); 
     config.LoggingRules.Add(rule2); 
     LogManager.Configuration = config; 

     logger.Trace("trace log message"); 
     logger.Debug("debug log message"); 
     logger.Info("info log message"); 
     logger.Warn("warn log message"); 
     logger.Error("error log message"); 
     logger.Fatal("fatal log message"); 

     logger.Log(LogLevel.Info, "Sample informational message"); 
     Console.ReadKey(); 
    } 

В комментариях к коду он определяет новые цели и правила. NLog.config будет переопределен во время выполнения.

Ниже мое NLog.config цель и правила

<targets> 
    <target xsi:type="File" name="file1" fileName="file1.log" layout="${message}" /> 
    <target xsi:type="File" name="file2" fileName="file2.log" layout="${message}" /> 
    <target xsi:type="File" name="file3" fileName="file3.log" layout="${message}" /> 
    <target xsi:type="File" name="file4" fileName="file4.log" layout="${message}" /> 
    <target xsi:type="File" name="file5" fileName="file5.log" layout="${message}" /> 
    <target xsi:type="File" name="file6" fileName="file6.log" layout="${message}" /> 
    </targets> 

    <rules> 
    <logger name="*" minlevel="Debug" writeTo="file1,file2,file3" /> 
    </rules> 

Этих цели и правила будут пересмотрены в то время выполнения наших C# код и только file7.log и file8.log будет рассмотрены для регистрации.

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