【问题标题】:How to make Serilog instance log to Seq immediately without having to call its Dispose()?如何使 Serilog 实例立即记录到 Seq 而无需调用其 Dispose()?
【发布时间】:2017-10-26 16:34:05
【问题描述】:

我有一个 Windows 服务,它处理长时间运行的任务,并且除非强制关闭(即计算机关闭),否则永远不会关闭。我想在 Windows 服务启动和运行的整个过程中保持同一个 Serilog 实例处于活动状态(出于性能原因)。

但是,我只看到 Dispose() 调用后的日志,如下所示。

var logger = new LoggerConfiguration()
            .WriteTo.Seq("http://localhost:5341")
            .CreateLogger();

logger.ForContext("TestContext", new { Machine = "TSTDB2" }, true).Information("Test");

logger.Dispose();

我不介意延迟几秒钟,但必须等到 Serilog 实例被释放后才对我有用。任何解决方案将不胜感激。

【问题讨论】:

  • 进程在你的测试中退出,还是你在长时间运行的进程中尝试过?您是否有机会以最小的Program.cs 复制重构您的场景?您是在创建多个记录器实例,还是将记录器分配给某处的静态字段? (HTH,只是想产生想法。)

标签: serilog seq seq-logging


【解决方案1】:

By default, the Seq Sink waits for 2 seconds在检查是否有消息要发送到服务器之前,因此如果您希望消息尽快发送,则需要将period设置为TimeSpan.Zero

var logger = new LoggerConfiguration()
            .WriteTo.Seq("http://localhost:5341", period: TimeSpan.Zero) // <---
            .CreateLogger();

【讨论】:

  • “期间:TimeSpan.Zero”对我不起作用。在我看到日志之前仍然必须调用 Dispose()。我有什么遗漏吗?
  • 您是否正在运行一个控制台应用程序,该应用程序在写入日志后就结束了?如果是这种情况,在您的应用程序结束之前,您应该调用 Log.CloseAndFlush(); 请参阅 Loggers 生命周期 - github.com/serilog/serilog/wiki/Lifecycle-of-Loggers
【解决方案2】:

我在调试时遇到了类似的问题。我意识到,当您放置断点并进行调试时,除非您允许几秒钟的处理时间,否则不会发生对 Seq 的调用。原因是它会在批量发送任何排队的日志之前保留日志几秒钟。多少和多久是可配置的。默认情况下,我认为是 2 秒。

您可能会尝试的另一件事是使用适用于控制台应用程序的全局上下文方法。

Log.Logger = new LoggerConfiguration()
        .WriteTo.Seq("http://localhost:5341", period: TimeSpan.Zero) // <---
        .CreateLogger();

// Now you can make logging calls from anywhere in the application (main thread). 
Log.Debug("Test log");

在某些情况下,某些异常和应用程序退出会阻止日志上传。确保在您的应用程序(或线程)出于任何原因退出之前留出时间上传日志。

【讨论】:

    猜你喜欢
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多