检测损坏的日志接收器的最佳实践
Best practice to detect broken log sinks
我正在尝试替换我的一位客户的内部编写的记录器解决方案。几乎所有事情都是直截了当的,但我需要实现一个接收器,将日志发送到我无法更改的自定义日志 window(目前)。它使用命名管道进行通信。此管道可能已损坏或繁忙,因此当前的解决方案实际上会阻塞每个日志调用 - 我想改进这一点。
问题是使用 serilog 时的最佳实践是什么:告诉 serilog 接收器当前已损坏的最佳方法是什么,因此它不会减慢系统速度。抛出异常就够了吗?
Serilog 本身并不知道(或关心)水槽何时坏了,所以我不确定我是否理解您的目标。
写入 Serilog 记录器应该是安全操作,by design, thus any exceptions that happen in your sink will automatically be caught by Serilog to make sure the app doesn't crash. Serilog will make sure these exceptions are written to the SelfLog
which developers can use to troubleshoot sink issues. See an example here。
因此,如果您的目标是让开发人员能够看到接收器何时遇到问题,建议将错误消息写入 SelfLog
并从接收器中抛出您自己的异常。
如果您可以从接收器中检测到命名管道在没有阻塞的情况下不可用,那么只需写入 SelfLog
和 return/short-circuit 而不要尝试写入它。在您的接收器中实现任何类型的 resilience policy 真的取决于您。
如果您的目标是改善阻塞调用,您可能需要考虑让接收器异步,在单独的线程上发送消息,而不阻塞应用程序的主线程。
鉴于您正在实施自己的自定义接收器,一种简单的方法是将您的接收器变成 Periodic Batching sink and leverage the infrastructure it provides. Alternatively, you can use Serilog.Sinks.Async 包装器接收器。
我正在尝试替换我的一位客户的内部编写的记录器解决方案。几乎所有事情都是直截了当的,但我需要实现一个接收器,将日志发送到我无法更改的自定义日志 window(目前)。它使用命名管道进行通信。此管道可能已损坏或繁忙,因此当前的解决方案实际上会阻塞每个日志调用 - 我想改进这一点。
问题是使用 serilog 时的最佳实践是什么:告诉 serilog 接收器当前已损坏的最佳方法是什么,因此它不会减慢系统速度。抛出异常就够了吗?
Serilog 本身并不知道(或关心)水槽何时坏了,所以我不确定我是否理解您的目标。
写入 Serilog 记录器应该是安全操作,by design, thus any exceptions that happen in your sink will automatically be caught by Serilog to make sure the app doesn't crash. Serilog will make sure these exceptions are written to the SelfLog
which developers can use to troubleshoot sink issues. See an example here。
因此,如果您的目标是让开发人员能够看到接收器何时遇到问题,建议将错误消息写入 SelfLog
并从接收器中抛出您自己的异常。
如果您可以从接收器中检测到命名管道在没有阻塞的情况下不可用,那么只需写入 SelfLog
和 return/short-circuit 而不要尝试写入它。在您的接收器中实现任何类型的 resilience policy 真的取决于您。
如果您的目标是改善阻塞调用,您可能需要考虑让接收器异步,在单独的线程上发送消息,而不阻塞应用程序的主线程。
鉴于您正在实施自己的自定义接收器,一种简单的方法是将您的接收器变成 Periodic Batching sink and leverage the infrastructure it provides. Alternatively, you can use Serilog.Sinks.Async 包装器接收器。