我正在尝试在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
记录级别介于Trace
和Info
之间的所有消息(=Trace
、Debug
和Info
)。
何时应使用此选项?
当您想要严格定义记录器以仅包含一系列可接受的日志级别之间的消息时。
我更改了级别值以证明一个点,即它选择级别介于上限 (maxLevel
) 和下限 (minLevel
之间的所有消息。
3.level
属性
您的fileLogException
只对一个级别的消息感兴趣,Info
.因此,您可以将其缩短为
<logger name="*" level="Info" writeTo="fileLogInfo"/>
何时应使用此选项?
当您想要严格定义记录器以仅包含来自单个日志级别的消息时。
4.levels
属性
levels
属性允许您显式指定多个级别(逗号分隔)。
<logger name="*" levels="Trace,Info,Fatal" writeTo="fileLogException"/>
何时应使用此选项?
当您想要严格定义您的记录器以仅包含来自无法用范围描述的多个日志级别的消息时。例如,如果要记录
Info
和Error
消息,并且要使用maxLevel
和minLevel
,则Nlog还将包括所有Warning
消息(因为这在日志级别的有序列表中介于Info
和Error
之间)。但是,您可以使用levels="Info,Error"
排除Warning
邮件。
所有信息均基于 NLog 文档
您需要第一个<logger>
规则上的final
属性
<logger name="*" minlevel="Error" writeTo="fileLogException" final="true"/>
<logger name="*" minlevel="Info" writeTo="fileLogInfo"/>
默认情况下,规则是非最终的,因此事件将写入所有符合名称和(最小)级别要求的记录器(从上到下)。
有关详细信息,请参阅文档