9

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

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

4

3 回答 3

14

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

<reconnectonerror value="True" />

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

Connect Timeout=1

如果您不这样做,如果数据库处于脱机状态,您的应用程序将非常慢。

于 2010-09-23T13:33:06.770 回答
7

如果在 .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/

于 2016-07-12T15:54:46.983 回答
0

一旦数据库服务器可用,使用reconnectonerror肯定可以让您再次开始记录,但中间日志消息在服务器关闭时会丢失。我认为 log4Net 没有任何规定可以在数据库服务器可用时保留消息。

于 2015-12-17T05:31:15.437 回答