为什么 NLogTraceListener 忽略 nlog 异步包装器?

Why NLogTraceListener ignores nlog async wrapper?

我使用 NLog 来记录 asmx 服务事件。 web.config的一部分:

<system.diagnostics>
    <trace autoflush="true" />
    <sources>
        <source name="System.Web.Services.Asmx">
            <listeners>
                <add name="nlog" type="NLog.NLogTraceListener, NLog" />
            </listeners>
        </source>
    </sources>
    <switches>
        <add name="System.Web.Services.Asmx" value="All" />
    </switches>
</system.diagnostics>

我在 nlog.config:

中使用了 asyncWrapper
<targets>
    <target name="AsyncTarget" xsi:type="AsyncWrapper">
        <target xsi:type="File" fileName="//192.168.0.5/Logs/file.log" layout="${message}"/>
    </target>
</targets>

<rules>
    <logger name="*" writeTo="AsyncTarget"/>
</rules>

所有日志记录成功。 10次请求(同时模拟)大约需要1秒.

问题是无法访问日志目标IP。那么10个请求(同时模拟)大约需要10秒.

异步包装器似乎无法正常工作。

当我将 web.config 中的 NLog.NLogTraceListener 侦听器更改为 System.Diagnostics.TextWriterTraceListener 时,问题就消失了。那么10个请求大概需要1秒左右(在日志目标IP不可达的情况下)。但是我需要使用NLog。

当我在代码中仅使用 nlog 方法从 web.config 日志禁用 asmx 日志记录时,问题就消失了,然后 10 个请求大约需要 1 秒(当日志目标 IP 不可访问时)并且异步包装器工作。但是我需要使用asmx源码日志。

你有什么办法解决这个问题吗?

解决方法是添加 disableFlush 设置:

<add name="nlog" type="NLog.NLogTraceListener, NLog" disableFlush="true" />

NLog 4.4 中的当前默认值是准备射击自己脚的霰弹枪,并将随 NLog 4.5 更改