log4net Adonet Appender连接问题

时间:2012-11-29 10:53:13

标签: c# windows-services log4net

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

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

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

  

log4net:ERROR [CustomAdoNetAppender]写入数据库时​​出现异常   Oracle.DataAccess.Client.OracleException ORA-03113:Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode,OracleConnection conn,IntPtr opsErrCtx,OpoSqlValCtx * pOpoSqlValCtx,Object src,String procedure)中的通信通道上的文件结束      at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode,OracleConnection conn,String procedure,IntPtr opsErrCtx,OpoSqlValCtx * pOpoSqlValCtx,Object src)      在Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery()      at log4net.Appender.AdoNetAppender.SendBuffer(IDbTransaction dbTran,LoggingEvent [] events)      at log4net.Appender.AdoNetAppender.SendBuffer(LoggingEvent [] events)

  

log4net:ERROR [CustomAdoNetAppender]写入数据库时​​出现异常   System.InvalidOperationException:Connection已经是本地或分布式事务的一部分      在Oracle.DataAccess.Client.OracleConnection.BeginTransaction(IsolationLevel isolationLevel)      在Oracle.DataAccess.Client.OracleConnection.BeginDbTransaction(IsolationLevel isolationLevel)      在System.Data.Common.DbConnection.System.Data.IDbConnection.BeginTransaction()      at log4net.Appender.AdoNetAppender.SendBuffer(LoggingEvent [] events)

对此的任何帮助都非常赞赏!

1 个答案:

答案 0 :(得分:3)

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

在log4net 1.2.11中AdoNetAppender提交保持开放连接而不是使用连接池的主要罪行。

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

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