如何配置NLog仅在指定事件属性存在时写入日志文件
NLog 动态部门日志文件配置解决方案
核心问题解决思路
要实现仅当日志带有有效Department属性时写入专属文件,同时让无属性的服务类消息写入默认文件,需从目标过滤和配置修正两方面入手:
1. 过滤无Department属性的日志(避免生成log-.txt)
给部门专属日志目标添加过滤规则,直接忽略没有Department属性或属性为空的日志,从根源阻止空文件名文件生成。
2. 修正布局语法错误
原布局中的!=''是语法错误,正确的when条件格式应为${message:when='${event-properties:item=Department}' != ''},但通过过滤规则后,布局可简化(仅处理符合条件的日志)。
3. 分离默认日志与部门日志
配置两个独立的FileTarget,分别处理无属性的服务日志和带Department属性的部门日志,避免重复写入。
完整代码配置示例
// 1. 配置默认服务日志目标(仅接收无Department属性的日志) var defaultLogTarget = new FileTarget("defaultLogs") { FileName = "log-default.txt", Layout = @"${date:format=yyyy.MM.dd. HH\:mm\:ss} [${level:uppercase=true}] ${message}" }; // 过滤规则:仅写入无Department属性的日志 defaultLogTarget.Filters.Add(new ConditionFilter { Condition = "${event-properties:item=Department} == ''", Action = FilterResult.Ignore // 存在Department属性则忽略 }); // 2. 配置部门专属日志目标(仅接收有效Department属性的日志) var departmentLogTarget = new FileTarget("departmentLogs") { // 兜底设置:若过滤失效,用unknown代替空值,避免生成log-.txt FileName = "log-${event-properties:item=Department:whenEmpty=unknown}.txt", Layout = @"${date:format=yyyy.MM.dd. HH\:mm\:ss} [${level:uppercase=true}] ${message}" }; // 过滤规则:仅写入存在且非空的Department属性日志 departmentLogTarget.Filters.Add(new ConditionFilter { Condition = "${event-properties:item=Department} != ''", Action = FilterResult.Ignore // 无有效Department则忽略 }); // 3. 注册目标并应用配置 var nlogConfig = new LoggingConfiguration(); nlogConfig.AddRule(LogLevel.Debug, LogLevel.Fatal, defaultLogTarget); nlogConfig.AddRule(LogLevel.Debug, LogLevel.Fatal, departmentLogTarget); LogManager.Configuration = nlogConfig;
日志调用保持原方式不变
// 部门日志(自动写入对应部门文件) _logger.ForDebugEvent() .Message("Logging hard work...") .Property("Department", Dept.Name) .Log(); // 服务类日志(自动写入default文件) _logger.Debug("Service startup completed");
关键说明
- 过滤规则是核心:通过
ConditionFilter精准控制日志流向,彻底解决空文件名问题 - 兜底设置:
whenEmpty=unknown是双重保障,即使过滤失效也不会生成log-.txt - 无重复日志:两个目标的过滤规则互斥,确保同一条日志只会写入一个文件
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

