我有一个 log4net ado appender 写入 SQL Server 数据库。我喜欢它,我觉得它很整洁。在将其发送到生产环境之前,我想知道如果数据库出现故障会发生什么行为。
我不希望应用程序因为日志数据库不可用而停止。我假设 log4net 会默默地失败而不做任何事情,至少这是我所希望的。任何人都可以确认这一点或(更好地)向我指出一些可以确认这一点的文件吗?
我有一个 log4net ado appender 写入 SQL Server 数据库。我喜欢它,我觉得它很整洁。在将其发送到生产环境之前,我想知道如果数据库出现故障会发生什么行为。
我不希望应用程序因为日志数据库不可用而停止。我假设 log4net 会默默地失败而不做任何事情,至少这是我所希望的。任何人都可以确认这一点或(更好地)向我指出一些可以确认这一点的文件吗?
appender(就像我知道的所有 log4net appender 一样)将静默失败,从而停止记录。您可以配置附加程序以尝试重新连接:
<reconnectonerror value="True" />
在这种情况下,您可能希望在 db 连接字符串中指定连接超时:
Connect Timeout=1
如果您不这样做,如果数据库处于脱机状态,您的应用程序将非常慢。
如果在 .Net 4.5.1 或更高版本中,您还必须ConnectRetryCount=0;
在连接字符串中进行设置。
附加器配置:
<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-442 https://blogs.msdn .microsoft.com/dotnet/2013/06/26/announcing-the-net-framework-4-5-1-preview/
一旦数据库服务器可用,使用reconnectonerror肯定可以让您再次开始记录,但中间日志消息在服务器关闭时会丢失。我认为 log4Net 没有任何规定可以在数据库服务器可用时保留消息。