如果配置文件丢失,log4net后备appender配置?

时间:2012-06-27 11:22:23

标签: c# log4net config

我有一个广泛使用log4net的C#(.NET 3.5)应用程序。 log4net配置位于app.config文件中。

使用[assembly: XmlConfigurator(Watch = true)]中的AssemlyInfo.cs完成配置 App使用单个应用程序范围的记录器实例,在logger包装器类的静态构造函数中实例化:

public class Logger{
    //....
    private static readonly ILog logger;
    static Logger()
    {
        logger = LogManager.GetLogger(Assembly.GetEntryAssembly().GetName().Name);

        AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;
    }
    //....
}

该应用程序旨在通过调度程序在远程服务器上运行,没有人类存在,单独在黑暗中。 :)问题是,如果缺少配置文件,它只是默默地崩溃(没有log4net config =>没有记录)。

有没有办法检查配置中是否有任何appender,如果没有 - 以编程方式添加某种回退appender。

我对log4X记录器系列很新,所以,如果我要求一些微不足道的东西 - 请善待,log4net文档非常糟糕。 :)

1 个答案:

答案 0 :(得分:0)

好的,问题已经在谷歌上了,我找到了答案,所以我就把它留在这里。 :)

操纵appender的关键是IAppenderAttachable接口,因为它实现了AddAppenderremoveAppender方法。

LogManager.GetLogger()返回的内容是ILog的实例,后者又包含属性LoggerILog.Logger返回的对象是Logger类实例。 Logger类实现IAppenderAttachable接口并包含Repository属性以提取记录器的存储库。存储库有方法GetAppenders,它返回AppenderCollection类实例(实现ICollectionIListIenumerable等)和记录器的所有活动的附加程序。 / p>

总结一下:

//no need to put it in the static constructor, but in my case it is so
static Logger() 
{
    logger = LogManager.GetLogger(...);
    if (logger.Logger.Repository.GetAppenders().Length == 0) {
        (logger.Logger as IAppenderAttachable).AddAppender(CreateConsoleAppender());
    }
}

private static ConsoleAppender CreateConsoleAppender()
{
    var appender = new ConsoleAppender();
    appender.Layout = CreateDefaultLayout();
    appender.AddFilter(CreateDefaultFilter());
    appender.ActivateOptions(); // if omitted - throws an excpetion
    log4net.Config.BasicConfigurator.Configure(appender); //if omitted - no errors, but logging does not work
    return appender;
}

private static ILayout CreateDefaultLayout()
{
    PatternLayout layout = new PatternLayout();
    layout.ConversionPattern = "%d{yyyy-MM-dd hh:mm:ss} - %level %m%n";
    layout.ActivateOptions();
    return layout;
}


private static IFilter CreateDefaultFilter()
{
    LevelRangeFilter filter = new LevelRangeFilter { LevelMin = Level.Info };
    filter.ActivateOptions();
    return filter;
}

请注意,如果文件丢失或损坏,log4net不会抛出任何异常(至少开箱即用),但没有附加到记录器的附加程序。