我需要登录使用 NLog 动态创建的多个文件。假设我们想要将每个部门记录到各自的文件中,并将服务消息记录到默认文件中。为了尝试实现这一目标,我使用
_logger.ForDebugEvent()
.Message("Logging hard work...")
.Property("Department", Dept.Name)
.Log();
在日志配置中我配置了这样的文件名(NLog是通过代码配置的):
FileName = "log-${event-properties:item=Department}.txt");
Layout = @"${date:format=yyyy.MM.dd. HH\:mm\:ss} [${level:uppercase=true}] ${message:when=${event-properties:item=Department}!=''",
此方法有效,但还会创建一个“log-.txt”文件(文件名中没有部门名称),其中包含未设置自定义属性的所有事件,并且所有行都以 !='' 结尾。显然“when”条件没有正确使用。我试图从这篇文章中扣除用法:https://nlog-project.org/2011/04/20/exception-logging-enhancements.html
如何确保仅在设置了事件属性时才写入目标?
我想通了。日志配置应如下所示:
FileName = "log-${event-properties:item=Department}.txt";
Layout = @"${date:format=yyyy.MM.dd. HH\:mm\:ss} [${level:uppercase=true}] ${message}";
然后你应该添加一个过滤器:
WhenNotEqualFilter fltDepartmentTarget = new()
{
Action = FilterResult.Log,
CompareTo = string.Empty,
Layout = "${event-properties:item=Department}"
};
然后需要将此过滤器添加到写入日志的规则中:
departmentRule.Filters.Add(fltDepartmentTarget);
这基本上只允许在日志事件中将 Department 属性设置为 string.Empty 之外的其他内容时进行日志记录。要记录事件,您可以使用
_logger.ForDebugEvent()
.Message("Logging hard work...")
.Property("Department", Dept.Name)
.Log();
如果您想从其他日志文件中排除这些消息,那么您应该向这些规则添加
WhenEqualFilter
,如下所示:
WhenEqualFilter fltFileTarget = new()
{
Action = FilterResult.Log,
CompareTo = string.Empty,
Layout = "${event-properties:item=Department}"
};
fileRule.Filters.Add(fltFileTarget);