c# - 在运行时在 NLog 中设置 Logger 的 writeTo 属性

标签 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:\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”属性?

非常感谢。

最佳答案

如果你想写入多个文件,你可以简单地使用逗号分隔的字符串作为规则中的“writeTo”属性,如“file1,file2,file3”。有 6 个目标,规则说写入 3 个文件,因此文件 1、文件 2 和文件 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 将被考虑用于日志记录。

关于c# - 在运行时在 NLog 中设置 Logger 的 writeTo 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40176178/

相关文章:

c# - .NET Framework 和兼容性

c# - DateTimeFormatInfo::AbbreviatedDayNames 的值是否在西类牙的 .Net 框架版本中发生过变化?

c# - Basedir的父目录——NLog配置

C#/ASP.NET Oledb - MS Excel 读取 "Unspecified error"

c# - 调用线程无法访问该对象,因为另一个线程拥有它(在 v4.5 中)

.net mvc重定向到不带参数的调用页面

.net - .NET没有概念性(Fatal-)Error异常类型的设计原因?

c# - NLog 目标文件名

conditional-statements - NLog 条件变量值

c# - ElasticSearch从指定术语中查找具有不同嵌套列表元素的索引对象