установите атрибут writeTo для Logger в NLog во время выполнения

#c# #.net #nlog

#c# #.net #nlog

Вопрос:

Моя программа на C # имеет приведенный ниже NLog.config:

 <?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:tempnlog-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» во время выполнения в соответствии с пользовательскими настройками?

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

Ответ №1:

Если вы хотите выполнять запись в несколько файлов, вы можете просто использовать разделенную запятыми строку для атрибута «writeTo» в правиле как «file1,file2,file3». Существует 6 целевых объектов, и правило предписывает записывать в 3 файла, поэтому file1, file2 и file 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 будут рассматриваться для ведения журнала.