我如何使用 Nlog 通过在运行时使用值来创建具有不同名称的文件?

how can i use Nlog to create files with different name by using the values at runtime?

我有一个案例,我需要为进入我系统的不同类型的数据创建单独的文件,我想使用 NLog 来确保每个事件类型都存储在它自己的事件类型文件中。例如 对于事件 a、b、c、a,我希望所有 a 事件都记录在名称为 a.txt 的文件中,所有 b 事件都记录在文件 b.txt.

C#代码

string[] events= { "a", "b", "c", "a" };
            foreach(string et in events)
            {
                NLog.LogManager.Configuration.Variables["filename"] = et ;
                LogManager.ReconfigExistingLoggers();
                logger.Warn(filename);
            }

这是我的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">
  <variable name ="filename" value="test"></variable>
  <targets>
    <target name="logfile" xsi:type="File" filename="${filename}.txt" />
    <target name="logconsole" xsi:type="Console" />
  </targets>

  <rules>
    <logger name="*" minlevel="Info" writeTo="logconsole" />
    <logger name="*" minlevel="Debug" writeTo="logfile" />
  </rules>
</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">
  <targets>
    <target name="logfile" xsi:type="File" filename="log.txt" />
    <target name="log_a" xsi:type="File" filename="a.txt" />
    <target name="log_b" xsi:type="File" filename="b.txt" />
    <target name="log_c" xsi:type="File" filename="c.txt" />
    <target name="logconsole" xsi:type="Console" />
  </targets>

  <rules>
    <logger name="*" minlevel="Info" writeTo="logconsole" />
    <!-- now add overrides for the log sources you want written to separate files -->
    <!-- order of the rules is important, because we're setting final = True --> 
    <logger name="a" minlevel="Debug" writeTo="log_a" final="True"/>
    <logger name="b" minlevel="Debug" writeTo="log_b" final="True"/>
    <logger name="c" minlevel="Debug" writeTo="log_c" final="True"/>
    <!-- anything not matched above will go to the general log file -->
    <logger name="*" minlevel="Debug" writeTo="logfile" />
  </rules>
</nlog>

希望对您有所帮助。你也可以用代码做同样的事情:

var config = new NLog.Config.LoggingConfiguration();

var logfile = new NLog.Targets.FileTarget()
{
    Name = "logfile",
    FileName = "logfile.txt"
}

var logconsole = new NLog.Targets.ColoredConsoleTarget() {
    Name = "logconsole"
    // other options here..
};
config.AddTarget(logconsole);
config.AddRule(NLog.LogLevel.Info, NLog.LogLevel.Fatal, logconsole, "*");


foreach (var et in events) {
  var target = new NLog.Targets.FileTarget() {
    Name = "log_" + et,
    FileName = et + ".txt"
  };
  config.AddTarget(target);
  config.AddRule(NLog.LogLevel.Info, NLog.LogLevel.Fatal, target, et, final: true);
}
config.AddTarget(logfile);
config.AddRule(NLog.LogLevel.Debug, NLog.LogLevel.Fatal, logfile, "*");                    

NLog.LogManager.Configuration = config;

我从未尝试过,但也许您可以在运行时多次更新配置,因为您会发现要添加的新事件。试试看。

您不应使用全局 NLog 配置变量来传输本地上下文。相反,您应该使用推荐的方法来处理 NLog 中的上下文:

https://github.com/NLog/NLog/wiki/Context

例如,您可以为您拥有的每个事件类型创建一个 Logger 对象:

var loggerA = NLog.LogManager.GetLogger("a");
loggerA.Info("Hello from a");
loggerA.Info("Goodbye from a");
var loggerB = NLog.LogManager.GetLogger("b");
loggerB.Info("Hello from b");
loggerB.Info("Goodbye from b");

并在 NLog FileTarget FileName 中使用 ${logger}:

<target name="logfile" xsi:type="File" filename="${logger}.txt" />

您还可以使用 Logger.WithProperty 将自定义 属性 添加到您的记录器,并将该记录器用于您的所有事件:

var loggerPropA = NLog.LogManager.GetCurrentClassLogger().WithProperty("EventType", "a");
loggerPropA.Info("Hello from a");
loggerPropA.Info("Goodbye from a");
var loggerPropB = NLog.LogManager.GetCurrentClassLogger().WithProperty("EventType", "b");
loggerPropB.Info("Hello from b");
loggerPropB.Info("Goodbye from b");

并在 NLog FileTarget FileName 中使用 ${event-properties:EventType}:

<target name="logfile" xsi:type="File" filename="${event-properties:EventType:whenEmpty=App}.txt" />

根据您拥有的活动事件类型数量(2 或 200)及其生命周期(2 分钟或 2 天),您可能需要研究这些 NLog FileTarget 选项:

  • openFileCacheTimeout
  • 打开文件缓存大小

另见 https://github.com/NLog/NLog/wiki/File-target