log4net到SQLServer:如果数据库不可用,会发生什么?

log4net到SQLServer:如果数据库不可用,会发生什么?,log4net,adonetappender,Log4net,Adonetappender,我有一个log4netado追加器正在写入sqlserver数据库。我喜欢它,我觉得它很整洁。在将其投入生产之前,我想知道如果数据库宕机,会出现什么行为 我不希望应用程序停止,因为日志数据库不可用。我认为log4net会默默地失败,什么也不做,至少我希望如此。有人能证实这一点吗,或者(更好的)给我指一些文档来证实这一点吗?appender(就像我所知道的所有log4net appender一样)将自动失败,从而停止日志记录。您可以将appender配置为尝试重新连接: <reconnect

我有一个log4netado追加器正在写入sqlserver数据库。我喜欢它,我觉得它很整洁。在将其投入生产之前,我想知道如果数据库宕机,会出现什么行为

我不希望应用程序停止,因为日志数据库不可用。我认为log4net会默默地失败,什么也不做,至少我希望如此。有人能证实这一点吗,或者(更好的)给我指一些文档来证实这一点吗?

appender(就像我所知道的所有log4net appender一样)将自动失败,从而停止日志记录。您可以将appender配置为尝试重新连接:

<reconnectonerror value="True" />

如果不这样做,则如果数据库脱机,应用程序将非常慢。

使用“重新连接错误”肯定会使您在数据库服务器可用后再次开始日志记录,但在服务器关闭时,中间日志消息将丢失。我认为log4Net没有任何规定在DB服务器可用时保存消息。

如果在.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。来源:

一个有趣的问题,但是你不能简单地通过让数据库离线,或者使用连接信息来指定一个不存在的数据库来测试它吗?我想我可以,但是有很多方法可以使数据库不可用-它可能已经耗尽了空间,或者运行非常缓慢,或者正在重新启动,或者诸如此类。我不能测试每个场景,所以我想我会看看是否有人知道。我一直在使用ADO.net appender进行我的项目。在prod中,情况很好,但在QA环境中,我们几个小时都没有活动,这导致数据库连接超时。几个月来,我一直在试图找出解决这个问题的神奇方法。感谢这篇文章,因为它解决了我的问题。Connect Timeout应该将拼写错误修复为Connect Timeout。如果您想提高性能而不命中数据库,请经常增加缓冲区大小,以便以块的形式写入消息。如果您的日志不总是100%最新的,请执行以下操作:
<ReconnectOnError value="true" />
<connectionString value="...Connect Timeout=1;ConnectRetryCount=0;" />