在运行时设置NLog记录器的writeTo属性

3

我的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:\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”。

那么,在运行时根据用户配置自定义“logger1”中的“writeTo”属性是否可能?

非常感谢。

1个回答

2
如果您想要写入多个文件,只需在规则中使用逗号分隔的字符串作为“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才会被考虑进行日志记录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接