9

我尝试使用设置测试 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 跟踪打开 c:\logs/NLogTest/2013/April/log-130401-Info.log 与 concurrentWrite=False

很奇怪,因为concurrentWrites默认值是true,而且我已经在 config.xml 中设置了这个值。

4

1 回答 1

8

问题在于AsyncWrappers的默认值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文档以获取更多信息。选项是阻止、丢弃或增长。

于 2013-04-01T20:20:41.490 回答