无可用服务器时的 Serilog 和 seq

Q-b*_*uit 4 c# seq serilog

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

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

在此输入图像描述

Cai*_*ete 10

当使用 Serilog 和 Seq 的应用程序找不到将日志发送到的服务器时,预期的行为是什么?

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

写入常规接收器意味着是一个安全的操作,并且永远不会抛出异常,这是设计使然。因此,发送这些消息时发生的任何异常只会在SelfLog您启用它时出现。

例如

// Write Serilog errors to the Console
Serilog.Debugging.SelfLog.Enable(msg => Console.WriteLine(msg));
Run Code Online (Sandbox Code Playgroud)

当然,上面的示例只是为了说明该SelfLog功能...您可以选择是否/在何处/如何显示或存储这些错误消息。

写入审核接收器时,您可能会看到每条失败的消息都会出现错误。

每次尝试记录都会抛出异常吗?

这取决于水槽。对于Serilog.Sinks.Seq,它是一个定期批处理接收器,因此它将尝试以X日志事件的批次发送消息(X可配置),因此如果 Seq 服务器不可用,您会期望看到一个错误每个发送失败的批次。

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

Seq 接收器具有内存缓冲和重试支持,可以处理短期服务器或网络不可用的情况,这通常足以满足大多数应用程序的需要。

或者,Seq 接收器内置了持久的日志传送,您可以指定磁盘上的一个文件,它将在磁盘上的文件上存储缓冲消息,因此即使您的应用程序重新启动,它也可以重试。

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

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

图 Seq Forwarder