简体   繁体   English

log4net后备附加程序配置是否丢失配置文件?

[英]log4net fallback appender configuration in case of missing config file?

I've got a C# (.NET 3.5) application that extensively use log4net. 我有一个广泛使用log4net的C#(.NET 3.5)应用程序。 The log4net configuration resides in the app.config file. log4net配置位于app.config文件中。

Configuration is done using [assembly: XmlConfigurator(Watch = true)] in AssemlyInfo.cs App uses single application-wide logger instance, instantiated in a static constructor of a logger wrapper class: 使用[assembly: XmlConfigurator(Watch = true)]完成AssemlyInfo.cs 。App使用单个应用程序范围的记录器实例,该实例在记录器包装器类的静态构造函数中实例化:

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

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

The app is designed to be run on distant server, by scheduler, with no human presense, alone in the dark. 该应用程序旨在通过调度程序在远程服务器上运行,无需人工干预,仅在黑暗中即可。 :) The problem is, in case of missing config file it just silently crashes (no log4net config => no logging). :)问题是,如果缺少配置文件,它只会以静默方式崩溃(没有log4net配置=>没有日志记录)。

Are there any way to check if there are any appenders in the config, and if not - programmatically add some kind of fallback appender. 有什么方法可以检查配置中是否有任何附加程序,如果没有,请以编程方式添加某种后备附加程序。

I'm rather new to log4X loggers family, so, if I'm asking something trivial - please be kind, log4net documentation is really awful. 我对Log4X记录器家族来说还很陌生,所以,如果我要问些琐碎的事情-请客气,log4net文档确实很糟糕。 :) :)

Ok, the question already on google, and I've found the answer, so I'll just left it here. 好的,问题已经在Google上了,我已经找到了答案,所以我就把它留在这里。 :) :)

The key to manipulating appenders is a IAppenderAttachable interface, since it implements AddAppender , removeAppender methods. 操纵附加程序的关键是IAppenderAttachable接口,因为它实现了AddAppenderremoveAppender方法。

What's returned by LogManager.GetLogger() is an instance of ILog , which in turn contains property Logger . LogManager.GetLogger()返回的是ILog的实例,该实例又包含属性Logger The object returned by the ILog.Logger is a Logger class instance. ILog.Logger返回的对象是Logger类实例。 Logger class implements IAppenderAttachable interface and contains Repository property to extract repository of the logger. Logger类实现IAppenderAttachable接口,并包含Repository属性以提取记录器的存储库。 Repository has method GetAppenders that returns AppenderCollection class instance (implements ICollection , IList , Ienumerable , etc.) with all the active appenders of the logger. 存储库具有方法GetAppenders ,该方法返回带有记录器所有活动附加程序的AppenderCollection类实例(实现ICollectionIListIenumerable等)。

To sum up: 总结一下:

//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;
}

Note that in case of missing or corrupted file log4net does not throw any exceptions (at least out of the box), but have no appenders attached to logger. 请注意,在文件丢失或损坏的情况下, log4net不会引发任何异常(至少是开箱即用),但是记录器没有附加任何附加程序。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM