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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (42)

我有一个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的调用。原因是因为在批量发送任何已排队的日志之前,它会保留日志几秒钟。可配置的频率和频率。默认情况下,我相信它是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");

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

用户回答回答于

默认情况下,SEQ sink等待2秒,如果有要发送到服务器的消息,所以你需要设置前检查periodTimeSpan.Zero,如果你想将邮件尽快去。

var logger = new LoggerConfiguration()
            .WriteTo.Seq("http://localhost:5341", period: TimeSpan.Zero) // <---
            .CreateLogger();

扫码关注云+社区

领取腾讯云代金券