ServiceBase.OnStop 期间的 NLog LogManager.LogFactory.Flush

Posted

技术标签:

【中文标题】ServiceBase.OnStop 期间的 NLog LogManager.LogFactory.Flush【英文标题】:NLog LogManager.LogFactory.Flush during ServiceBase.OnStop 【发布时间】:2020-11-05 11:58:42 【问题描述】:

我有一些 NLog 日志目标,它们包装在我的 Windows 服务应用程序中的 AsyncTargetWrapper 实例中。当调用ServiceBase.OnStop() 时,我想确保LogManager.Flush(15000) 有15 秒的时间通过调用ServiceBase.RequestAdditionalTime(15000) 将任何缓存的消息刷新到日志目标。但哪个应该先出现?我是先拨打Flush(),然后再拨打RequestAdditionalTime(),还是反过来?

我会这样做吗:

protected override void OnStop()

    // Tell NLog to flush; give it 15 seconds:
    LogManager.Flush(15000);

    // Ask the Service Control Manager not to mark us unresponsive for 15 seconds:
    RequestAdditionalTime(15000);

或者我应该这样做:

protected override void OnStop()

    // Ask the Service Control Manager not to mark us unresponsive for 15 seconds:
    RequestAdditionalTime(15000);

    // Tell NLog to flush; give it 15 seconds:
    LogManager.Flush(15000);

【问题讨论】:

【参考方案1】:

由于LogManager.Flush 在您的示例中可能需要 15 秒,我建议您先请求额外的时间。所以:

protected override void OnStop()

    // Ask the Service Control Manager not to mark us unresponsive for 15 seconds:
    RequestAdditionalTime(15000);

    // Tell NLog to flush; give it 15 seconds:
    LogManager.Flush(15000);

或者甚至更好:

protected override void OnStop()

    // Ask the Service Control Manager not to mark us unresponsive for 15 seconds:
    RequestAdditionalTime(15100); // 100 extra ms

    // Tell NLog to flush; give it 15 seconds:
    LogManager.Flush(15000);

【讨论】:

这很有意义。我被挂断的地方是,无论我在堆栈上堆放多少缓存日志条目,我都无法让 Flush() 花费更多的时间,所以我不清楚 Flush() 是否是否异步发生。但是,是的,首先请求额外的时间然后刷新是有道理的。谢谢!

以上是关于ServiceBase.OnStop 期间的 NLog LogManager.LogFactory.Flush的主要内容,如果未能解决你的问题,请参考以下文章

Linux下nl命令的用法详解

nl 命令

Linux常用命令11:nl

Linux系统常用命令nl详解

Docker BitBucket管道中缺少区域设置nl_NL

linux学习笔记10---命令nl