c# - 如何有条件地抑制写入事件日志的应用程序异常?

标签 c# exception windows-services event-log

我正在开发一个 Windows 服务,该服务每 15 秒轮询一次与支持网络的设备的连接。如果服务无法连接到设备,则会引发异常并在 15 秒后重试。所有这些都非常有效。

但是,假设其中一台设备已停机一天或更长时间。我每 15 秒就会用相同的异常填充我的异常日志。如果抛出的异常在过去 x 小时内没有更改,是否有标准方法可以防止将异常写入事件日志?

最佳答案

实现您所需的一个好方法是采用断路器设计模式。

我第一次在 Pragmatic Press 的 Michael T. Nygard 所著的《Release It! Design and Deploy Production Ready Software》一书中读到这一点,第 104-107 页。

断路器的想法是,它位于系统之间的连接路径中,传递连接,监视“中断条件”。例如,仅当连续五个连接全部失败时才可能触发。

一旦电路断开,所有通过断路器的调用都会立即失败,而无需咨询外部服务。这种情况持续到发生超时,此时断路器进入半开状态。尝试下一次调用 - 失败会导致超时重置,断路器成功合闸并且系统恢复运行。

快速谷歌发现a post by Tim Ross读起来很好,而且有更多细节。

在您的情况下,您可以使用超时为 10 分钟并触发 5 次失败的断路器。如果发生全天故障,您的日志文件将包含针对原始问题记录的 5 个异常,然后每小时仅记录 6 个异常(与每 15 秒间隔 240 个异常相比),表明问题仍然存在。

根据您的要求,您可以手动“重置”断路器,也可以让它在 10 分钟超时后显示一切恢复正常时自动重置。这可能很有用 - 一般来说,系统管理员需要烦恼的事情越少,他们就越喜欢它。

关于c# - 如何有条件地抑制写入事件日志的应用程序异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/248527/

相关文章:

c# - 多个线程调用同一函数不起作用

c# - 如何读取和修改 XML 文件中的数据?

java - 重新抛出 Java 异常与使用 instanceof/cast 的开销

Python CSV 阅读器应在输入错误时引发错误

windows-services - .Net Quartz Scheduler 2.3 无法在远程服务器上运行

c# - EntityFramework 4.5 - 即使在使用 Include 之后仍然会出现 ObjectDisposedException

c# - Gridview 清理和整洁 asp.net

c# - Linq Union 的问题行为?

c# - 以编程方式在远程计算机上安装 Windows 服务

NHibernate session (和无状态 session )和长时间运行的应用程序