当使用 Serilog 和 Seq 的应用程序找不到将日志发送到的服务器时,预期的行为是什么?
这取决于您是否使用常规水槽(通过.WriteTo
)或审计接收器(通过.AuditTo
).
写入常规接收器意味着是安全操作并且永远不会抛出异常,并且这是设计使然 https://github.com/serilog/serilog/wiki/Reliability。因此,发送这些消息时发生的任何异常只会出现在SelfLog
如果你启用它。
e.g.
// Write Serilog errors to the Console
Serilog.Debugging.SelfLog.Enable(msg => Console.WriteLine(msg));
当然,上面的例子只是为了说明SelfLog
功能...您可以选择是否/在何处/如何显示或存储这些错误消息。
写入审核接收器时,您可能会看到每条失败的消息都会出现错误。
每次尝试记录都会抛出异常吗?
这取决于水槽。如果是Serilog.Sinks.Seq https://github.com/serilog/serilog-sinks-seq, 它是周期性配料水槽 https://github.com/serilog/serilog-sinks-periodicbatching,所以它会尝试分批发送消息X
记录事件(X
是可配置的),因此如果 Seq 服务器不可用,您可能会看到每个无法发送的批次都会出现错误。
我希望我的应用程序使用 Seq 服务器(如果可用),但如果不可用,仍继续运行并记录到文件。
Seq 接收器具有内存缓冲和重试支持,可以处理短期服务器或网络不可用的情况,这通常足以满足大多数应用程序的需要。
或者,Seq 接收器具有持久的日志传送功能 https://docs.datalust.co/docs/using-serilog#asynchronous-batching-and-durable-log-shipping烘焙后,您可以指定磁盘上的一个文件,它将在磁盘上的文件中存储缓冲消息,因此即使您的应用程序重新启动,它也可以重试。
Log.Logger = new LoggerConfiguration()
.WriteTo.Seq("https://my-seq-server:5341",
bufferBaseFilename: @"C:\MyApp\Logs\myapp") // <<<<<<
.CreateLogger();
最后,另一种选择是使用序列转发器 https://github.com/datalust/seq-forwarder您可以与您的应用程序并排安装(即同一服务器),并将日志直接写入其中,它负责将日志保存到自己的内部本地存储中,并在远程 Seq 服务器可用时将其转发到远程 Seq 服务器。