4

我有一个 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 实例被处理后对我来说不起作用。任何解决方案将不胜感激。

4

2 回答 2

1

我在调试时遇到了类似的问题。我意识到,当您放置断点并进行调试时,除非您允许几秒钟的处理时间,否则不会发生对 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");

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

于 2018-06-07T21:07:41.170 回答
1

默认情况下,Seq Sink在检查是否有消息要发送到服务器之前等待 2 秒,因此如果您希望消息尽快发送,则需要将 设置period为。TimeSpan.Zero

var logger = new LoggerConfiguration()
            .WriteTo.Seq("http://localhost:5341", period: TimeSpan.Zero) // <---
            .CreateLogger();
于 2017-10-26T17:31:39.813 回答