NLog:如果填充字段,则记录到单个文件

时间:2018-10-17 17:26:25

标签: c# nlog

我有一套Windows服务-共7个。这些服务跟踪不同工作流的不同方面。

在其中,我设置了一个名为scanid的字段:

public static void SetScanid(this ILogger logger, int? scanid)
{
    GlobalDiagnosticsContext.Set("scanid", scanid);
}

在nlog.config文件中,我用它来填充部分日志以便快速查找/查找:

<variable name="messageLayout" value="[${longdate}] -- [SID:${gdc:item=scanid}] ... " />

在任何给定过程的开始,我设置了SCANID,最后清除了它。

现在,在7个不同的日志文件中,我将SID作为可搜索字段。

我可以改为:创建一个仅在填充该字段时才记录到给定文件的目标吗?

说,类似

<target xsi:type ="File"
    name="sidTarget"
    fileName="Logs\Process-${gdc:item=scanid}.log"
    when=" ??? scanid is not null or empty ??? "
    ... />

或者规则中是否有涵盖这一点的东西?

2 个答案:

答案 0 :(得分:1)

您可以在<rules>部分进行配置。

例如

<logger name="*" writeTo="sidTarget">
  <filters>
    <when condition="length('${gdc:item=scanid}') == 0" action="Ignore" />
  </filters>
</logger> 

请参见filtering log messages<when> docs

答案 1 :(得分:1)

另一种解决方案是使用NLog FallbackGroup目标。它允许您将多个目标分组,以便它们成为一个目标。如果该组中的第一个目标失败,则它将重试该组中的下一个目标(使用其他文件名)。

另请参阅https://github.com/nlog/NLog/wiki/FallbackGroup-target