为什么NLog在记录大量消息的情况下会遗漏一些消息?
本文关键字:消息 情况下 NLog 记录 为什么 | 更新日期: 2023-09-27 18:06:41
我尝试用设置测试NLog性能(最新版本):
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true">
<variable name="basePath" value="c:'logs'" />
<variable name="msgFormat" value="${message}" />
<targets async="true">
<target name="file"
xsi:type="File"
fileName="${basePath}/${logger}/${date:format=yyyy}/${date:format=MMMM}/log-${date:format=yyMMdd}-${level}.log"
layout="${msgFormat}"
concurrentWrites="true" />
</targets>
<rules>
<logger name="*" minlevel="Debug" writeTo="file"/>
</rules>
</nlog>
并运行以下代码:
var msg = "this is example string for logging test. it's not very long, but not very short";
var count = 20000;
Parallel.For(0, count, x => nlog.Info(msg));
NLog写入文件,但当文件大小达到1MB时停止写入。我尝试使用简单的for
循环,但它没有帮助我。我尝试使用内部日志记录,但没有错误,顺便说一下,我看到这里有这个字符串:
2013-04-01 11:36:18.2458 Trace Openingc: ' logs/NLogTest/2013/4月/日志- 130401 info.logconcurrentWrite = False
这很奇怪,因为concurrentwrite的默认值是true
,而且我已经在配置中设置了这个值。
问题在于AsyncWrapper
= QueueLimit
的默认值为10000。
该值决定了允许写入的消息队列的大小,出现问题是因为所有20000条消息都在写入文件之前排队,这导致NLog丢弃最后的10000条消息。
不幸的是,当使用async
属性时,这不能改变,您必须手动定义AsyncWrapper
才能控制QueueLimit
,这是这样做的:
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true">
<variable name="basePath" value="c:'logs'" />
<variable name="msgFormat" value="${message}" />
<targets async>
<target name="asyncWrapper" xsi:Type="AsyncWrapper" queueLimit="20000">
<target name="file"
xsi:type="File"
fileName="${basePath}/${logger}/${date:format=yyyy}/${date:format=MMMM}/log-${date:format=yyMMdd}-${level}.log"
layout="${msgFormat}"
concurrentWrites="true" />
</target>
</targets>
<rules>
<logger name="*" minlevel="Debug" writeTo="file"/>
</rules>
</nlog>
其中QueueLimit设置为20000
您还可以更改OverflowAction
,如果您需要做一些其他的丢弃消息不放在队列中,请参阅AsyncWrapper文档了解更多信息。选项为Block, Discard或Grow