首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何让Serilog实例在不调用Dispose()的情况下立即记录到Seq?

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

Stack Overflow用户
提问于 2017-10-27 00:34:06
回答 2查看 2.6K关注 0票数 4

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

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

代码语言:javascript
复制
var logger = new LoggerConfiguration()
            .WriteTo.Seq("http://localhost:5341")
            .CreateLogger();

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

logger.Dispose();

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

EN

回答 2

Stack Overflow用户

发布于 2017-10-27 01:31:40

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

代码语言:javascript
复制
var logger = new LoggerConfiguration()
            .WriteTo.Seq("http://localhost:5341", period: TimeSpan.Zero) // <---
            .CreateLogger();
票数 1
EN

Stack Overflow用户

发布于 2018-06-08 05:07:41

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

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

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46959493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档