我有一个写入SQL Server数据库的log4net ado appender。我喜欢它,我觉得它很整洁。在我将其发送到生产环境之前,我想知道如果数据库发生故障会导致什么行为。
我不希望应用程序停止,因为日志记录数据库不可用。我假设log4net会默默地失败并且什么都不做,至少那是我所希望的。任何人都可以证实这一点,或者(更好)指出一些可以证实这一点的文件吗?
答案 0 :(得分:13)
appender(就像我所知道的所有log4net appender一样)将无声地失败,从而停止记录。您可以配置appender尝试重新连接:
<reconnectonerror value="True" />
在这种情况下,您可能希望在数据库连接字符串中指定连接超时:
Connect Timeout=1
如果您不这样做,如果数据库脱机,您的应用程序将非常慢。
答案 1 :(得分:6)
如果在.Net 4.5.1或更高版本中,您还必须在连接字符串中设置ConnectRetryCount=0;
。
Appender配置:
<ReconnectOnError value="true" />
<connectionString value="...Connect Timeout=1;ConnectRetryCount=0;" />
如果你像Log4Net.Async那样执行异步记录,那么Connect Timeout可能会默认保留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/
答案 2 :(得分:0)
使用 reconnectonerror 肯定会让您在数据库服务器可用后再次开始记录,但在服务器关闭时,中间日志消息将丢失。我认为log4Net没有任何规定来保留数据库服务器可用的消息。