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.LoggingNuGet包,并且在Program.cs中初始化NLog:var logger = NLog.LogManager.Setup().LoadConfigurationFromAppSettings().GetCurrentClassLogger(); logger.Debug("NLog初始化完成");
内容的提问来源于stack exchange,提问作者user687554
相关产品推荐
相关产品推荐

