如何知道log4net是否记录了错误

Nic*_*las 7 c# log4net

我在我的控制台应用程序中使用log4net,我log.Error("Message to log");在if/else结构中多次使用.
我的应用程序必须返回一个代码,该代码指定在应用程序运行期间是否发生错误(0→ok,1→至少发生1个错误).
有没有办法询问log4net是否记录了错误,例如:

bool b = LogManager.AtLeastOneErrorHasBeenLogged;
Run Code Online (Sandbox Code Playgroud)

stu*_*rtd 6

如果您使用自定义appender,它的唯一目的是跟踪是否发生错误,这似乎很简单.

这个(未经测试的)示例使用仅在使用a时日志级别为Error的情况下调用appender的技术,LevelRangeFilter但您可以轻松地在Append方法或根记录器配置中检查日志级别(或其他条件).该示例假设您使用的是XML配置而不是编程配置,但可以以编程方式添加appender,以便所有记录器都可以使用它们.

追加者:

public namespace MyApp
{
    public class ErrorFlagAppender : AppenderSkeleton
    {
        public bool ErrorOccurred { get; set; }

        protected override void Append(LoggingEvent loggingEvent)
        {
            ErrorOccurred = true;
        }
    }
} 
Run Code Online (Sandbox Code Playgroud)

配置:

<appender name="ErrorFlagAppender" type="MyApp.ErrorFlagAppender,MyApp" >
    <filter type="log4net.Filter.LevelRangeFilter">
        <levelMin value="ERROR"/>
        <levelMax value="ERROR"/>
    </filter>
</appender>

<root>
  <appender-ref ref="[your existingappender]" />
  <appender-ref ref="ErrorFlagAppender" />
</root>
Run Code Online (Sandbox Code Playgroud)

然后你可以有一个扩展方法来查看是否发生了错误:

public static class LogManagerExtensions
{
    public static bool AtLeastOneErrorHasBeenLogged(this LogManager logManager)
    {
        var flagAppenders = logManager.GetRepository()
                                      .GetAppenders()
                                      .OfType<ErrorFlagAppender>();

        return flagAppenders.Any(f => f. ErrorOccurred);
    }
}
Run Code Online (Sandbox Code Playgroud)