NLog - 条件文件输出

NLog - Conditional File Output

我有一个使用 NLog 的 C# 控制台应用程序。在该应用程序中,我试图有条件地将信息记录到文件位置。作为一个人为的例子,假设我有时需要将条目记录到 "evens" 日志文件,有时我需要将条目记录到 "odds" 日志文件。为了尝试这样做,我设置了以下配置:

<nlog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <targets>
    <target name="evensLogFile" xsi:type="File" fileName="${basedir}/logs/evens.log" createDirs="true" keepFileOpen="true" encoding="utf-8" layout="${longdate} ${message}${exception:format=ToString}"></target>
    <target name="oddsLogFile" xsi:type="File" fileName="${basedir}/logs/odds.log" createDirs="true" keepFileOpen="true" encoding="utf-8" layout="${longdate} ${message}${exception:format=ToString}"></target>
  </targets>

  <rules>
    <logger name="Evens" minlevel="Trace" writeTo="evensLogFile" />
    <logger name="Odds" minlevel="Trace" writeTo="oddsLogFile" />
  </rules>
</nlog>

现在,在我的代码中,当我想写一个日志条目时,我有以下内容:

public void Log(string message)
{
  var random = new Random();
  var i = random.Next(1, 11);

  Logger logger = null;
  if(i%2 == 0) {
    // somehow get a logger for "evens" 
  } else {
    // somehow get a logger for "odds"
  }
  logger.Log(LogLevel.Info, message);
}

如果我使用Logger logger = LogManager.GetCurrentClassLogger();,我可以成功地将日志写入单个日志文件,但是,我无法根据某些逻辑弄清楚如何将不同的日志消息记录到不同的文件。感谢您的帮助!

您可以通过名称获取日志,例如:

  if(i%2 == 0) {
    logger = LogManager.GetLogger("Evens");
  } else {
    logger = LogManager.GetLogger("Odds");
  }

我用谷歌搜索了“NLog 多文件目标”和 this is what I came across。以下代码应该适用于您当前的配置。

class Program
{
    static void Main(string[] args)
    {
        Log("message 1");
        Log("message 2");
        Log("message 3");
        Log("message 4");
    }

    public static void Log(string message)
    {
        var random = new Random();
        var i = random.Next(1, 11);

        Logger logger = null;
        if (i % 2 == 0)
        {
            logger = LogManager.GetLogger("Evens");
        }
        else
        {
            logger = LogManager.GetLogger("Odds");
        }
        logger.Trace($"{message} - {i}");
    }
}

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">
  <targets>
    <target name="evensLogFile" xsi:type="File" fileName="${basedir}/logs/evens.log" createDirs="true" keepFileOpen="true" encoding="utf-8" layout="${longdate} ${message}${exception:format=ToString}"></target>
    <target name="oddsLogFile" xsi:type="File" fileName="${basedir}/logs/odds.log" createDirs="true" keepFileOpen="true" encoding="utf-8" layout="${longdate} ${message}${exception:format=ToString}"></target>
  </targets>

  <rules>
    <logger name="Evens" minlevel="Trace" writeTo="evensLogFile" />
    <logger name="Odds" minlevel="Trace" writeTo="oddsLogFile" />
  </rules>
</nlog>

odds.log

2018-04-24 19:50:04.9421 消息 2 - 3

2018-04-24 19:50:05.1211 消息 3 - 9

evens.log

2018-04-24 19:50:04.7572 消息 1 - 8

2018-04-24 19:50:05.3137 消息 4 - 6

编辑: 使用目标而不是记录器名称。 Edit2: 添加了 program.cs、nlog.config、输出日志