我开发了一个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)
对此的任何帮助都非常赞赏!
答案 0 :(得分:3)
我个人认为这是log4net AdoNetAppender中的一个错误。
在log4net 1.2.11中AdoNetAppender
提交保持开放连接而不是使用连接池的主要罪行。
此外,ReconnectOnError选项看起来已损坏:如果当前连接状态不是ConnectionState.Open
,它只会尝试重新连接,这似乎是错误的:我不相信当出现错误时连接状态会发生变化(枚举值ConnectionState.Broken
在MSDN中记录为保留用于产品的未来版本。)
总而言之,我建议您实现自己的自定义appender,以正确连接池。它不是一个非常大的类,因此很容易复制和修复。