为什么NLog在记录大量消息时会遗漏一些消息?

时间:2013-04-01 07:42:10

标签: c# .net logging nlog

我尝试使用以下设置测试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循环,但它对我没有帮助。 我尝试使用internal logging,但没有错误,顺便说一下我看到这个字符串:

  

2013-04-01 11:36:18.2458跟踪开幕   c:\ logs / NLogTest / 2013 / April / log-130401-Info.log with   concurrentWrite =假

这很奇怪,因为concurrentWrites默认值为true,而且我已在配置中设置此值。

1 个答案:

答案 0 :(得分:8)

问题在于AsyncWrapper s 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。