如何使用NLog编写多个“数据”文件

时间:2014-01-15 17:16:00

标签: c# nlog

我希望我的应用程序在应用程序生命周期内重复写入大量数据以分离“日志”文件。 (将此类文件的每个实例称为“数据文件”。)数据在单个写入操作中写入此文件(因为它是一个字符串)。在主应用程序日志文件中,应用程序将写入它创建的数据文件的路径名,以便我可以识别在执行时创建的数据文件。

我可以使用.NET文件API创建数据文件,但我认为使用NLog会很有用,因为我可以通过配置启用文件写入。但是,我无法看到如何定义名称对于每个写操作唯一的Target。作为替代方案,我可以以编程方式创建一个Target,并在每次写入数据文件时将其添加到LogManager的Configuration对象,然后删除Target。

这似乎是合理的,但在实施之前,我想知道其他人是否有类似的要求以及他们是如何实施的。

1 个答案:

答案 0 :(得分:4)

您可以配置NLog,以便输出文件的名称(在使用文件目标的情况下)是“动态的”。您可以在文件名配置中使用LayoutRenderers。因此,您可以将目标配置为:

  <targets>
    <target name="file" xsi:type="File" layout="${verbose}" fileName="${basedir}/${gdc:DataFile}.log" />
  </targets>

在您的代码中,您可以执行以下操作:

NLog.GlobalDiagnosticsContext.Set("DataFile", "SomeName");

当NLog写入时,它将解析文件名。如果文件存在,则日志将写入该文件。如果该文件不存在,则NLog将创建一个新文件。因此,在您的情况下,如果在每次写入之前在GlobalDiagnosticsContext字典中设置新值,您将获得一个新文件。您可以尝试使用其他LayoutRenders,看看您是否可以免费获得所需的行为。例如,如果你使用CounterLayoutRenderer,你可能会为每一次写入获得一个不同的文件(我没有尝试过,所以我不能肯定地说)。

您可以将其配置为:

  <targets>
    <target name="file" xsi:type="File" layout="${verbose}"fileName="${basedir}/${counter}.log" />
  </targets>

更新 - 您也可以使用CounterLayoutRenderer作为文件名的基础,而不是将其作为整个文件名接受。

  <targets>
    <target name="file" xsi:type="File" layout="${verbose}"fileName="${basedir}/MyDataStuff_${counter}.log" />
  </targets>

这将生成如下文件名: MyDataStuff_0.log MyDataStuff_1.log MyDataStuff_2.log 等...

使用LayoutRenderers构建输出文件名非常灵活,因此您应该能够找到满足您需求的解决方案。

也许这会给你一些想法