NLog 仅当提供特定名称的事件属性时才写入日志文件

问题描述 投票:0回答:1

我需要登录使用 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

如何确保仅在设置了事件属性时才写入目标?

c# nlog
1个回答
0
投票

我想通了。日志配置应如下所示:

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);
© www.soinside.com 2019 - 2024. All rights reserved.