NLog AsyncTaskTarget不在第一次迭代后批处理行

时间:2019-03-18 19:15:55

标签: c# nlog

我正在尝试为NLog编写一个自定义异步目标,该目标会将日志推送到Azure,并遇到意外情况。基本上是这样的:当我要调用的异步任务很慢时(在本示例中为1.5s),在第一批处理之后,所有剩余的日志条目都将以单批发送。

这可以通过TaskDelayMilliseconds的各种值以及各种应用程序延迟来重现。我希望每隔“ TaskDelayMilliseconds”执行一次“写入”操作,除非出现异常/重试。我怀疑这可能是AsyncTaskTarget中的错误,但是在提交之前,我希望进行社区审查。有什么想法吗?预先感谢。

此代码需要NLog Nuget 4.6.0-rc3。当前版本中不提供新的要覆盖的异步批处理方法。

[Target("AsyncTestTarget")]
public class AsyncTestTarget : AsyncTaskTarget
{
    protected override void InitializeTarget()
    {
        base.InitializeTarget();

        BatchSize = 10000;
        TaskDelayMilliseconds = 3000;
    }


    protected override Task WriteAsyncTask(LogEventInfo logEvent, CancellationToken cancellationToken)
    {
        InternalLogger.Info($"NLog.Extensions.AsyncTestTarget.WriteAsyncTask()");
        return WriteAsyncTask(new List<LogEventInfo> {logEvent}, cancellationToken);
    }

    protected override Task WriteAsyncTask(IList<LogEventInfo> logEvents, CancellationToken cancellationToken)
    {
        InternalLogger.Info($"NLog.Extensions.AsyncTestTarget.WriteAsyncTask(List) : {logEvents.Count}");
        if (!logEvents.Any())
            return Task.CompletedTask;
        // If this line is commented, the rows are batched as expected.  If this line is left as-is, then after the first batch, records are sent one at a time.
        System.Threading.Thread.Sleep(TimeSpan.FromMilliseconds(1500));

        return Task.CompletedTask;
    }
}

示例程序代码:

class Program
{
    static ILogger logger = LogManager.GetCurrentClassLogger();
    static void Main(string[] args)
    {

        for (var i = 0; i < 5000; i++)
        {
            logger.Info(i.ToString());
            System.Threading.Thread.Sleep(TimeSpan.FromMilliseconds(100));
        }

        logger.Info("Done");

        LogManager.Flush(TimeSpan.FromSeconds(15));
    }
}

NLog配置:

<nlog internalLogLevel="Debug" internalLogToConsole="true">
    <extensions>
      <add assembly="ConsoleApp1"/>
    </extensions>

    <targets>
      <target type="console" name="console"/>
      <target type="AsyncTestTarget" name="test" />
    </targets>

    <rules>
      <logger name="*" minlevel="Trace" writeTo="console" />
      <logger name="*" minlevel="Trace" writeTo="test" />
    </rules>
</nlog>

在WriteAsyncTask中没有睡眠的屏幕截图: Screenshot #1

在WriteAsyncTask中睡眠的屏幕快照(错误): Screenshot #2

1 个答案:

答案 0 :(得分:0)

NLog 4.6.1已发布,可解决#3185https://www.nuget.org/packages/NLog