c# - log4net Adonet Appender 连接问题

标签 c# windows-services log4net

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

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

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

log4net:ERROR [CustomAdoNetAppender] Exception while writing to database Oracle.DataAccess.Client.OracleException ORA-03113: end-of-file on communication channel at 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) at Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery() at log4net.Appender.AdoNetAppender.SendBuffer(IDbTransaction dbTran, LoggingEvent[] events) at log4net.Appender.AdoNetAppender.SendBuffer(LoggingEvent[] events)

和:

log4net:ERROR [CustomAdoNetAppender] Exception while writing to database System.InvalidOperationException: Connection is already part of a local or a distributed transaction at Oracle.DataAccess.Client.OracleConnection.BeginTransaction(IsolationLevel isolationLevel) at Oracle.DataAccess.Client.OracleConnection.BeginDbTransaction(IsolationLevel isolationLevel) at System.Data.Common.DbConnection.System.Data.IDbConnection.BeginTransaction() at log4net.Appender.AdoNetAppender.SendBuffer(LoggingEvent[] events)

对此非常感谢!

最佳答案

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

在 log4net 1.2.11 中,AdoNetAppender 犯下了保持开放连接而不是使用连接池的主要错误。

ReconnectOnError 选项看起来也坏了:它只在当前连接状态不是 ConnectionState.Open 时才尝试重新连接,这似乎是错误的:我不相信连接状态会在有是一个错误(枚举值 ConnectionState.Broken 在 MSDN 中记录为为产品的 future 版本保留)。

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

关于c# - log4net Adonet Appender 连接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13624150/

相关文章:

asp.net - Log4Net 在本地工作,但不在远程 Azure DB 上工作

c# - c#中带有过滤器的log4net纯代码配置

c# - 提交表单时如何获取当前 View 的操作名称?

c# - 记住窗口位置、大小和状态 [在 Win + 箭头对齐时](使用多个显示器)

c# - 重定向到 ASP.NET MVC 中的操作,方法不会返回 View

c# - 将颜色加载到组合框中

c# - 安装 .NET 开发的 Windows 服务时出错

windows - 完全阻止进程显示任何对话框?

c# - 双击启动 Windows 服务

wcf - log4net 在 wcf PerSession 服务中使用 ThreadContext.Properties