如何在不调用Dispose()的情况下立即将Serilog实例登录到Seq?

问题描述 投票:3回答:2

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

seq serilog
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");

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


0
投票

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();
© www.soinside.com 2019 - 2024. All rights reserved.