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

时间:2017-10-26 16:34:06

标签: seq serilog

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

2 个答案:

答案 0 :(得分: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");

在某些情况下,某些例外和应用程序退出会阻止日志上传。确保在应用程序(或线程)退出之前,无论出于何种原因,都要在上传时间。

答案 1 :(得分: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();