【问题标题】:set the writeTo attribute of Logger in NLog during runtime在运行时在 NLog 中设置 Logger 的 writeTo 属性
【发布时间】:2016-10-21 23:38:24
【问题描述】:

我的 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”属性?

非常感谢。

【问题讨论】:

    标签: c# .net nlog


    【解决方案1】:

    如果您想写入多个文件,您可以简单地将逗号分隔的字符串用于 Rule 中的“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();
        }
    

    正如代码 cmets 所解释的,它定义了新的目标和规则。 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 进行日志记录。

    【讨论】:

      猜你喜欢
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-28
      • 2014-08-21
      • 2011-01-02
      相关资源
      最近更新 更多