Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Log4net-在AdoneAppender和RollingFileAppender之间动态切换appender_Log4net - Fatal编程技术网

Log4net-在AdoneAppender和RollingFileAppender之间动态切换appender

Log4net-在AdoneAppender和RollingFileAppender之间动态切换appender,log4net,Log4net,我正在asp.net应用程序中使用AdoNetAppender(SQL server),并希望在SQL出现任何连接问题时使用RollingFileAppender。是否有任何方法可以配置为仅在AdoNetAppender出现问题时使用RollingFileAppender 谢谢 por在log4net中没有对这种故障切换场景的内置支持,问题是在log4net体系结构中,附加程序彼此非常隔离 不过,一种常见的设置是让两个appender并行登录,只是文件appender只保存(比如)一周的数据。如

我正在asp.net应用程序中使用AdoNetAppender(SQL server),并希望在SQL出现任何连接问题时使用RollingFileAppender。是否有任何方法可以配置为仅在AdoNetAppender出现问题时使用RollingFileAppender

谢谢


por

在log4net中没有对这种故障切换场景的内置支持,问题是在log4net体系结构中,附加程序彼此非常隔离

不过,一种常见的设置是让两个appender并行登录,只是文件appender只保存(比如)一周的数据。如果AdonNetAppender失败,您将始终在文件中保存最新数据


但我可以肯定地看到,对于一个appender,它可以有一个优先级列表,其中包含一些子appender,在发生故障时执行一些简单的故障切换。这两种方法都不难实现。

我已经实现了这样一个appender,并在博客中介绍了它和(镜像)。代码可以找到

我扩展并创建了一个名为Appender的新Appender,它有两个AppenderSkeleton类型的成员

  • 一个名为“PrimaryAppender”的默认appender,默认情况下使用,直到失败为止
  • 名为“FailoverAppender”的故障转移追加器—仅在主设备发生故障后使用
PrimaryAppender和FailoverAppender的实际类型是使用log4net的xml配置语法配置的(请参见下面的示例)

片段:

公共类故障覆盖出现者: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。