2012-11-29 51 views
7

我开发了一个Windows服务,其中我使用计时器控件执行一些计划任务。定时器过期事件每5分钟发生一次,其中使用log4net appender向Oracle数据库创建日志条目。log4net Adonet Appender连接问题

所有工作正常,直到数据库服务器关闭夜间冷备份的所有连接。从那时起,所有DB中的日志都会丢失,并且不记录任何内容,除非服务重新启动,即使备份过程少于30分钟。

从其他帖子我发现,log4net只使用一个连接,如果丢失,则所有后续日志都将被丢弃。为了弥补这一点,我开始在其配置中使用ReconnectOnError属性集作为true。但不幸的是,这个问题仍然存在。备份后日志仍然丢失。我启用了跟踪并发现了以下错误,但我不知道如何解决此问题。

log4net的:ERROR [CustomAdoNetAppender]异常当写入到数据库 Oracle.DataAccess.Client.OracleException ORA-03113:在Oracle.DataAccess.Client.OracleException.HandleErrorHelper上通信信道文件结束-(的Int32 ERRCODE ,康涅狄格州的OracleConnection,IntPtr的opsErrCtx,OpoSqlValCtx * pOpoSqlValCtx,对象的src,字符串过程) 在Oracle.DataAccess.Client.OracleException.HandleError(的Int32 ERRCODE,康涅狄格州的OracleConnection,字符串过程,IntPtr的opsErrCtx,OpoSqlValCtx * pOpoSqlValCtx,对象SRC) 在Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery() at log4net.Appender.AdoNetAppender.SendBuffer(IDbTransaction dbTran,LoggingEvent [] events) log4net.Appender.AdoNetAppender.SendBuffer(LoggingEvent所[]事件)

和:

log4net的:ERROR [CustomAdoNetAppender]异常当写入到数据库 System.InvalidOperationException:连接已经是部分本地或分布式事务 at Oracle.DataAccess.Client.OracleConnection.BeginTransaction(IsolationLevel isolationLevel) at Oracle.DataAccess.Client.OracleConnection.BeginDbTransaction(IsolationLevel isolationLevel) at System.Data.Common.DbConnection.System.Data。 IDbConnection.BeginT ransaction() 在log4net.Appender.AdoNetAppender.SendBuffer(LoggingEvent所[]事件)

任何帮助在此高度赞赏!!

回答

3

我个人认为这是log4net AdoNetAppender中的一个bug。

在log4net 1.2.11中AdoNetAppender承诺保持开放连接而不是使用连接池的主要罪过。

此外ReconnectOnError选项看起来坏了:它只尝试重新连接,如果当前连接状态不是ConnectionState.Open,这似乎是错误的:我不相信当出现错误时连接状态改变(枚举值ConnectionState.Broken在MSDN中记录为为未来版本的产品保留)。

总而言之,我建议您实现自己的自定义appender,它可以正确连接池。这不是一个非常大的课程,所以很容易复制和修复。

+0

感谢您的回复。是否有可能在某处或在自定义Appender中捕获log4net异常? – Lucky