我希望我的应用程序在应用程序生命周期内重复写入大量数据以分隔“日志”文件。 (将此类文件的每个实例称为“数据文件”。)数据通过单个写入操作写入此文件(因为它是字符串)。在主应用程序日志文件中,应用程序将写入它创建的数据文件的路径名,以便我可以识别在执行过程中该点创建的数据文件。
我可以使用 .NET 文件 API 创建数据文件,但我认为使用 NLog 会很有用,因为我可以通过配置启用文件写入。但是,我不知道如何定义一个名称对于每个写入操作都是唯一的目标。作为替代方案,我可以通过编程方式创建一个 Target,并在每次写入数据文件时将其添加到 LogManager 的 Configuration 对象,然后删除该 Target。
这似乎是合理的,但在实现之前我想知道其他人是否有类似的要求以及他们是如何实现的。
最佳答案
您可以配置 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 字典中设置一个新值,您将获得一个新文件。您可以尝试其他 LayoutRender,看看是否可以免费获得您想要的行为。例如,如果您使用 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 构建输出文件名非常灵活,因此您应该能够找到满足您需求的解决方案。
也许这会给你一些想法
关于c# - 如何使用NLog写入多个 "data"文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21143981/