2012-06-27 101 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不拋出任何異常(至少開箱即用),但沒有連接到記錄儀追加程序。

相關問題