【问题标题】:log4net to SQLServer : what happens if database is unavailable?log4net 到 SQLServer:如果数据库不可用会发生什么?
【发布时间】:2016-07-12 23:54:46
【问题描述】:

我有一个 log4net ado appender 写入 SQL Server 数据库。我喜欢它,我觉得它很整洁。在将其发送到生产环境之前,我想知道如果数据库出现故障会发生什么行为。

我不希望应用程序因为日志数据库不可用而停止。我假设 log4net 会默默地失败并且不做任何事情,至少这是我所希望的。任何人都可以确认这一点或(更好地)向我指出一些可以确认这一点的文档吗?

【问题讨论】:

  • 有趣的问题,但您不能简单地通过使数据库脱机或使用指定不存在的数据库的连接信息来测试吗?
  • 好吧,我想我可以,但是有很多方法可能导致数据库不可用——它可能已经空间不足,或者运行速度非常慢,或者正在重新启动等等。我无法测试所有场景,所以我想看看是否有人确定。

标签: log4net adonetappender


【解决方案1】:

附加程序(就像我知道的所有 log4net 附加程序一样)将静默失败,从而停止记录。您可以配置 appender 以尝试重新连接:

<reconnectonerror value="True" />

在这种情况下,您可能希望在数据库连接字符串中指定连接超时:

Connect Timeout=1

如果你不这样做,如果数据库离线,你的应用程序会很慢。

【讨论】:

  • 我一直在为我的项目使用 ADO.net 附加程序。在 prod 中事情很好,但是在我们的 QA 环境中,我们几个小时都没有活动,这导致我们的数据库连接超时。几个月来,我一直试图找出解决这个问题的神奇设置。感谢这篇文章,因为它解决了我的问题。
  • 连接超时应将拼写错误修复为连接超时。
  • 如果您想在不影响数据库的情况下提高性能,通常会增加缓冲区大小,以便将消息写入块中。如果您可以忍受您的日志并不总是 100% 最新,那么请执行以下操作:
【解决方案2】:

如果在 .Net 4.5.1 或更高版本中,您还必须在连接字符串中设置 ConnectRetryCount=0;

Appender 配置:

<ReconnectOnError value="true" />
<connectionString value="...Connect Timeout=1;ConnectRetryCount=0;" />

如果您使用 Log4Net.Async 之类的异步日志记录,则连接超时可能会保留为默认 15 秒。

详情

.Net 4.5.1 增加了 ADO.NET 连接弹性,它告诉 Log4Net 连接仍然打开,即使它不是,并尝试使用 ConnectRetryCount 重新连接。但是,由于我们想让 Log4Net 进行重新连接,并且 ConnectRetryCount 的最大值为 255,我们应该将 ConnectRetryCount 设置为 0。来源:https://issues.apache.org/jira/browse/LOG4NET-442https://blogs.msdn.microsoft.com/dotnet/2013/06/26/announcing-the-net-framework-4-5-1-preview/

【讨论】:

    【解决方案3】:

    使用 reconnectonerror 肯定会让您在 DB 服务器可用后重新开始记录,但中间的日志消息会在服务器关闭时丢失。我认为 log4Net 没有任何规定可以在数据库服务器可用时持久保存消息。

    【讨论】:

      猜你喜欢
      • 2011-02-26
      • 1970-01-01
      • 2011-11-05
      • 1970-01-01
      • 2014-06-24
      • 2017-12-03
      • 2011-04-02
      • 1970-01-01
      • 2018-09-09
      相关资源
      最近更新 更多