没有可用服务器时的 Serilog 和 seq

Serilog and seq when no server available

当使用 Serilog 和 Seq 的应用程序找不到要将日志发送到的服务器时,预期的行为是什么?每次尝试记录都会抛出异常吗?

如果可用,我希望我的应用程序使用 Seq 服务器,但如果不可用,我仍会继续 运行 并记录到文件。

Serilog 有很强的保证永远不会抛出到日志线程(exceptions from forwarding like you cite are emitted via SelfLog)

这并不常见 and/or 没有自然的方式来开箱即用地说“Seq but fall back to file” - 批处理接收器保存东西并最终丢弃东西以避免 运行内存。

https://github.com/serilog/serilog-sinks-async is probably worth a read if you're considering what semantics you really want regarding File and/or Server. (Perhaps if you're in a hosted env with health checks, you might consider an inability to forward logs to be an indicator of ill-health - the obvious problem in that case is that any replacement instance likely would not fare any better). Also this Best practices Guide 的 README 可能会帮助您思考您真正想要什么。

遗憾的是,您最好将问题分成几个单独的问题,以帮助在此处实际回答。

What is the expected behavior when an application that uses Serilog and Seq can't find a server to send the logs to?

这取决于您使用的是常规接收器(通过 .WriteTo)还是审计接收器(通过 .AuditTo)。

写入常规接收器是一种安全操作,永远不会抛出异常,that's by design。因此,如果您启用它,发送这些消息时发生的任何异常只会出现在 SelfLog 中。

例如

// Write Serilog errors to the Console
Serilog.Debugging.SelfLog.Enable(msg => Console.WriteLine(msg));

当然,上面的示例只是为了说明 SelfLog 功能...您可以选择 if/where/how 来显示或存储这些错误消息。

写入审计接收器时,您希望看到每条失败消息的错误。

Will every attempt to log throw an exception?

这取决于接收器。在 Serilog.Sinks.Seq, it's a periodic batching sink 的情况下,它会尝试成批发送消息 X 日志事件(X 是可配置的)所以如果 Seq 服务器不可用,你会期望看到每批发送失败的错误。

I would like my app to use the Seq server if it's available, but still continue to run and log to file if it is not.

Seq sink 具有内存缓冲和重试支持,可以处理短时间的服务器或网络不可用,这对于大多数应用程序来说通常就足够了。

或者,Seq sink has durable log shipping 内置,您可以在磁盘上指定一个文件,它将在磁盘上的文件中存储缓冲消息,这样即使您的应用程序重新启动,它也可以重试。

Log.Logger = new LoggerConfiguration()
    .WriteTo.Seq("https://my-seq-server:5341",
        bufferBaseFilename: @"C:\MyApp\Logs\myapp") // <<<<<<
    .CreateLogger();

最后,另一种选择是使用 Seq Forwarder,您可以将它与您的应用程序(即同一服务器)并排安装,然后将日志直接写入它,它负责将它们持久化到它自己的内部本地存储,并在可用时将它们转发到远程 Seq 服务器。