我有一个处理长时间运行任务的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实例被释放后才能工作。任何解决方案都将不胜感激。
发布于 2017-10-27 01:31:40
在检查是否有消息要发送到服务器之前执行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();
发布于 2018-06-08 05:07:41
我在调试时遇到了类似的问题。我意识到,当您放置一个断点并进行调试时,对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");
也有一些情况下,某些异常和应用程序退出会阻止日志上传。确保在您的应用程序(或线程)出于任何原因退出之前,给您的日志留出上传的时间。
https://stackoverflow.com/questions/46959493
复制相似问题