Log4net-在AdoneAppender和RollingFileAppender之间动态切换appender
我正在asp.net应用程序中使用AdoNetAppender(SQL server),并希望在SQL出现任何连接问题时使用RollingFileAppender。是否有任何方法可以配置为仅在AdoNetAppender出现问题时使用RollingFileAppender 谢谢Log4net-在AdoneAppender和RollingFileAppender之间动态切换appender,log4net,Log4net,我正在asp.net应用程序中使用AdoNetAppender(SQL server),并希望在SQL出现任何连接问题时使用RollingFileAppender。是否有任何方法可以配置为仅在AdoNetAppender出现问题时使用RollingFileAppender 谢谢 por在log4net中没有对这种故障切换场景的内置支持,问题是在log4net体系结构中,附加程序彼此非常隔离 不过,一种常见的设置是让两个appender并行登录,只是文件appender只保存(比如)一周的数据。如
por在log4net中没有对这种故障切换场景的内置支持,问题是在log4net体系结构中,附加程序彼此非常隔离 不过,一种常见的设置是让两个appender并行登录,只是文件appender只保存(比如)一周的数据。如果AdonNetAppender失败,您将始终在文件中保存最新数据
但我可以肯定地看到,对于一个appender,它可以有一个优先级列表,其中包含一些子appender,在发生故障时执行一些简单的故障切换。这两种方法都不难实现。我已经实现了这样一个appender,并在博客中介绍了它和(镜像)。代码可以找到 我扩展并创建了一个名为Appender的新Appender,它有两个AppenderSkeleton类型的成员
- 一个名为“PrimaryAppender”的默认appender,默认情况下使用,直到失败为止
- 名为“FailoverAppender”的故障转移追加器—仅在主设备发生故障后使用
公共类故障覆盖出现者:AppenderSkeleton
{
私人附加者基尔顿(primaryAppender),;
私人附属者;失败附属者;
....
}
在Append方法的实现中,默认情况下,我只向PrimaryAppender发送数据,并用try-catch将其包围。如果PrimaryAppender抛出(失败),我会发出一个标志并将LoggingEvent发送给FailoverAppender。
下一个日志事件将直接发送,并且仅发送到故障切换程序
受保护的覆盖无效附加(LoggingEvent LoggingEvent)
{
如果(日志故障覆盖)
{
_failOverAppender?.doAppended(记录事件);
}
其他的
{
尝试
{
_primaryAppender?.DoAppend(记录事件);
}
抓住
{
激活EFAILOVERMODE();
附加(记录事件);
}
}
}
此外,我还创建了一个自定义函数,它将传播内部appender异常,以发出appender内部出现故障的信号,这将使LoggingEvents仅发送到FailoverAppender
类FailOverErrorHandler:IErrorHandler
{
公共故障附加器故障附加器{get;set;}
公共故障切换错误处理程序(故障切换附加故障切换附加)
{
FailOverAppender=故障overappender;
}
公共无效错误(字符串消息、异常e、错误代码)
=>FailOverAppender.ActivateFailOverMode();
公共无效错误(字符串消息,异常e)
=>FailOverAppender.ActivateFailOverMode();
公共无效错误(字符串消息)
=>FailOverAppender.ActivateFailOverMode();
}
配置示例:
感谢Peter抽出宝贵的时间和精彩的讲解。我来看看AppenderSkeletton。