NLog 多个文件目标问题



我正在尝试在WPF应用程序中实现NLog。

我们需要有两个文件日志目标,

1)用于调试或开发人员目的,这是一些"信息日志" 文件夹
2) 用于错误或异常目的,这将进入某些 "错误日志"文件夹中的文件夹

基目录。 下面是我在 nlog.config 中的代码和配置。

<variable name="ErrorLayout" value="${longdate} | ${logger} | ${level} | 
${message} ${exception:format=message,stacktrace:separator=/}" />
<variable name="InfoLayout" value="${longdate} | ${logger} | ${level} | 
${message}"/>
<variable name="ErrorDir" value="${basedir}/Errorlogs/${longdate}">
</variable>
<variable name="InfoDir" value="${basedir}/Infologs/${longdate}"></variable>
<target xsi:type="File" name="fileLogException" archiveEvery="Month" 
createDirs="true" lineEnding="Default" layout="${ErrorLayout}" 
fileName="${ErrorDir}.log"/>
<target xsi:type="File" name="fileLogInfo" archiveEvery="Month" 
createDirs="true" lineEnding="Default" layout="${InfoLayout}" 
fileName="${InfoDir}.log"/>

<logger name="*"  minlevel="Error" writeTo="fileLogException"/>
<logger name="*"  minlevel="Info" writeTo="fileLogInfo"/>

预期成果:

_logger.Info("Sample informational message");//This should  write to only fileLogInfo
_logger.Error("Sample error message"); //this  should write to only fileLogException
_logger.Fatal("Sample fatal error message"); //this  should write to only fileLogException

当前结果:

_logger.Info() write to --> fileLogInfo
_logger.Error() & _logger.Fatal() both  write to --> fileLogInfo and fileLogException

请提供任何帮助,谢谢

这里有多种方法。在我看来,选项3.是您当前情况的最佳解决方案。

1.final属性

(这与朱利安的答案相同)

<logger name="*"  minlevel="Error" writeTo="fileLogException" final="true"/>
<logger name="*"  minlevel="Info" writeTo="fileLogInfo"/>

将属性添加到fileLogException意味着当消息写入fileLogException时,NLog 之后不会查找任何其他日志。
请注意,NLog 从上到下评估记录器。final只会阻止较低的记录器接收相同的日志消息。

这是一个解决方案,但它可能会导致将来出现问题。如果删除fileLogException(或更改记录器的顺序),则fileLogInfo的内容将更改(因为不再有消息被fileLogException停止)。

何时应使用此选项?
当您想要拦截消息并防止它们被添加到其他日志中时。
对于您当前的示例,乍一看这似乎可用。这主要是因为您没有根据记录器的名称来分隔记录器。但是,当您开始考虑具有name要求而不仅仅是水平要求的记录器时,例如


<logger name="MyApplication.Repositories.*" final="true" writeTo="fileLogRepository" /><logger name="MyApplication.Importers.*" final="true" writeTo="fileLogImport" />
<logger name="*" writeTo="fileLogAllUnloggedMessages" />

什么时候应该和不应该使用它变得更加明显。在上面的示例中,底部日志将捕获所有消息,除了任何先前的记录器已经记录的消息(当然标记为final)。

阿拉伯数字。maxLevel属性

就像你用过minLevel一样,还有一个maxLevel属性。

<logger name="*"  minlevel="Error" writeTo="fileLogException"/>
<logger name="*"  minlevel="Trace" maxLevel="Info" writeTo="fileLogInfo"/>

fileLogException记录级别为Error及以上的所有消息,而fileLogInfo记录级别介于TraceInfo之间的所有消息(=TraceDebugInfo)。

何时应使用此选项?
当您想要严格定义记录器以仅包含一系列可接受的日志级别之间的消息时。

我更改了级别值以证明一个点,即它选择级别介于上限 (maxLevel) 和下限 (minLevel之间的所有消息。

3.level属性

您的fileLogException只对一个级别的消息感兴趣,Info.因此,您可以将其缩短为

<logger name="*" level="Info" writeTo="fileLogInfo"/>

何时应使用此选项?
当您想要严格定义记录器以仅包含来自单个日志级别的消息时。

4.levels属性

levels属性允许您显式指定多个级别(逗号分隔)。

<logger name="*" levels="Trace,Info,Fatal" writeTo="fileLogException"/>

何时应使用此选项?
当您想要严格定义您的记录器以仅包含来自无法用范围描述的多个日志级别的消息时。

例如,如果要记录InfoError消息,并且要使用maxLevelminLevel,则Nlog还将包括所有Warning消息(因为这在日志级别的有序列表中介于InfoError之间)。但是,您可以使用levels="Info,Error"排除Warning邮件。


所有信息均基于 NLog 文档

您需要第一个<logger>规则上的final属性

<logger name="*"  minlevel="Error" writeTo="fileLogException" final="true"/>
<logger name="*"  minlevel="Info" writeTo="fileLogInfo"/>

默认情况下,规则是非最终的,因此事件将写入所有符合名称和(最小)级别要求的记录器(从上到下)。

有关详细信息,请参阅文档

最新更新