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.

4

1 に答える 1

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のドキュメントを参照してください。オプションは、ブロック、破棄、または成長です。

于 2013-04-01T20:20:41.490 に答える