You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NLog条件化文件输出问题:C#控制台程序日志分流配置求助

没问题,我来帮你完成NLog的条件化日志输出配置。核心思路是通过NLog的规则(rules)配合条件过滤(condition),结合自定义日志属性来控制不同日志条目输出到对应的文件。

完整的NLog配置示例

首先是补全后的nlog.config文件内容,我帮你完善了targets和rules部分,加入了奇偶判断的条件:

<nlog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <!-- 定义输出目标:两个文件分别存储偶数和奇数日志 -->
  <targets>
    <target name="evensLogFile" xsi:type="File" 
            fileName="${basedir}/logs/evens.log" 
            layout="${longdate} ${level} ${message} ${exception}" />
    <target name="oddsLogFile" xsi:type="File" 
            fileName="${basedir}/logs/odds.log" 
            layout="${longdate} ${level} ${message} ${exception}" />
  </targets>

  <!-- 配置日志路由规则,通过条件判断分配到不同文件 -->
  <rules>
    <!-- 当自定义属性LogNumber为偶数时,输出到evensLogFile -->
    <logger name="*" minlevel="Trace" writeTo="evensLogFile" 
            condition="${event-properties:item=LogNumber} % 2 == 0" />
    <!-- 当自定义属性LogNumber为奇数时,输出到oddsLogFile -->
    <logger name="*" minlevel="Trace" writeTo="oddsLogFile" 
            condition="${event-properties:item=LogNumber} % 2 != 0" />
  </rules>
</nlog>
C#代码中如何使用

在你的控制台应用里,需要在记录日志时传入自定义的LogNumber属性,让NLog能根据这个值判断奇偶:

using NLog;

namespace YourConsoleApp
{
    class Program
    {
        private static readonly Logger _logger = LogManager.GetCurrentClassLogger();

        static void Main(string[] args)
        {
            // 示例:循环记录10条日志,每条带不同的序号
            for (int i = 1; i <= 10; i++)
            {
                var logEvent = new LogEventInfo(LogLevel.Info, _logger.Name, $"日志条目 {i}");
                // 添加自定义属性LogNumber
                logEvent.Properties["LogNumber"] = i;
                _logger.Log(logEvent);
            }

            // 关闭NLog,确保所有日志都写入文件
            LogManager.Shutdown();
        }
    }
}

如果觉得每次创建LogEventInfo太麻烦,还可以写个扩展方法简化调用:

public static class LoggerExtensions
{
    public static void LogWithSequence(this Logger logger, LogLevel level, string message, int sequenceNumber)
    {
        var logEvent = new LogEventInfo(level, logger.Name, message);
        logEvent.Properties["LogNumber"] = sequenceNumber;
        logger.Log(logEvent);
    }
}

// 使用时就简洁多了:
_logger.LogWithSequence(LogLevel.Info, "这是一条测试日志", 7);
其他可选的条件判断方式

如果你不是基于自定义序号,而是想根据其他条件过滤,比如:

  • 根据日志消息内容:condition="${message} contains '偶数'"
  • 根据日志级别:condition="${level} == 'Warn'"
  • 根据日志来源类名:condition="${logger} == 'YourConsoleApp.Program'"
注意事项
  • 确保nlog.config的复制到输出目录设置为「始终复制」,否则程序运行时找不到配置文件;
  • 如果是.NET Core/.NET 5+项目,记得安装NLog.Extensions.Logging NuGet包,并且在Program.cs中初始化NLog:
    var logger = NLog.LogManager.Setup().LoadConfigurationFromAppSettings().GetCurrentClassLogger();
    logger.Debug("NLog初始化完成");
    

内容的提问来源于stack exchange,提问作者user687554

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:12:11