2012-06-27 37 views
1

我有一个广泛使用log4net的C#(.NET 3.5)应用程序。 log4net配置驻留在app.config文件中。log4net fallback appender配置在缺少配置文件的情况下?

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

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

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

该应用程序被设计为远程服务器上运行,通过调度程序,没有人的主题,独自在黑暗中。 :)问题是,在缺少配置文件的情况下,它只是静默崩溃(没有log4net配置=>没有日志记录)。

还有什么办法来检查是否有在配置任何附加目的地,如果没有 - 编程添加某种回退的appender。

我是相当新的log4X伐木工人家庭,所以,如果我问一些小事 - 请善待,log4net的文档非常可怕的。 :)

+1

它可以操纵日志,看看这个答案:http://stackoverflow.com/questions/1519728/programmatically-adding-and-removing-log-appenders-in-log4net – Thinhbk

+0

测试的存在配置文件。如果它不存在,请在代码中创建您的记录器 - http://stackoverflow.com/questions/1436713/cant-configure-log4net-in-code。或者,将log4net配置与应用程序打包为嵌入式资源,以便永远不会丢失。或者只是确保你总是将配置与应用程序一起发送;-) – dash

回答

0

好了,已经在谷歌问题,我已经找到了答案,所以我就离开这里。 :)

操作appender的关键是​​接口,因为它实现了AddAppender,removeAppender方法。

LogManager.GetLogger()返回的是ILog的实例,该实例又包含属性LoggerILog.Logger返回的对象是一个Logger类实例。 Logger类实现​​接口并包含Repository属性以提取记录器的存储库。存储库具有方法GetAppenders返回AppenderCollection类实例(实现ICollectionIListIenumerable等)与记录器的所有活性追加程序。

综上所述:

//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不抛出任何异常(至少开箱即用),但没有连接到记录仪追加程序。