2009-02-18 121 views
38

我正在嘗試自定義log4net文件路徑以使用我在log4net.GlobalContext.Properties字典中設置的屬性。如何在log4net appender名稱中使用GlobalContext屬性?

log4net.GlobalContext.Properties["LogPathModifier"] = "SomeValue"; 

我可以看到,通過它進行調試時,該值設置正確。然後在我的配置

<file type="log4net.Util.PatternString" 
     value="Logs\%appdomain_%property{LogPathModifier}.log" /> 

但是,這樣的輸出給我「_(null).log」在路徑的末尾。是什麼賦予了?

回答

54

我遇到了相同的行爲,並通過調用XmlConfigurator之前設置的全局變量解決它...這就是我成功地利用:

log4net.config細節:

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender,log4net"> 
    <File type="log4net.Util.PatternString" value="App_Data/%property{LogName}" /> 
    ... 
</appender> 

全球細節的.asax:

private static readonly log4net.ILog log = log4net.LogManager.GetLogger("Global.asax"); 
void Application_Start(object sender, EventArgs e) 
{ 
    // Set logfile name and application name variables 
    log4net.GlobalContext.Properties["LogName"] = GetType().Assembly.GetName().Name + ".log"; 
    log4net.GlobalContext.Properties["ApplicationName"] = GetType().Assembly.GetName().Name; 

    // Load log4net configuration 
    System.IO.FileInfo logfile = new System.IO.FileInfo(Server.MapPath("log4net.config")); 
    log4net.Config.XmlConfigurator.ConfigureAndWatch(logfile); 

    // Record application startup 
    log.Debug("Application startup"); 
} 

希望這有助於...

+0

我有完全相同的問題,在我的情況下,我試圖從2個不同的進程登錄到相同的文件。它獲得了2個獨立的文件,但在調用第二個應用程序中的XmlConfigurator之前設置全局變量解決了這個問題。非常感謝你。 +1 – 2011-09-30 19:19:25

1

記錄器是否已通過應用程序中的全局或主方法初始化?可能是GlobalContext尚未初始化。

+0

我呼籲LogManager.GetLogger()在設置屬性之前。另外,日誌記錄工作正常,只是文件名沒有提取自定義值。 – 2009-02-19 09:33:24

13

添加類型= log4net.Util.PatternString爲File元素

4

的問題(我認爲)是,你得到(GetLogger)記錄器設置的名稱和加載配置之前...

嘗試做申報,如記錄儀:private static log4net.ILog _pLog ,然後在Application_Start做:

void Application_Start(object sender, EventArgs e) 
{ 
    // Set logfile name and application name variables 
    log4net.GlobalContext.Properties["LogName"] = GetType().Assembly.GetName().Name + ".log"; 
    log4net.GlobalContext.Properties["ApplicationName"] = GetType().Assembly.GetName().Name; 

    // Load log4net configuration 
    System.IO.FileInfo logfile = new System.IO.FileInfo(Server.MapPath("log4net.config")); 
    log4net.Config.XmlConfigurator.ConfigureAndWatch(logfile); 

    //Get the loger 
    _pLog = log4net.LogManager.GetLogger("Global.asax"); 

    // Record application startup 
    pLog .Debug("Application startup"); 
} 

所以順序是:

// Set logfile name and application name variables 
// Load log4net configuration 
// get the logger 
// Record application startup 
相關問題