2

我今天開始玩log4net,到目前爲止,我真的很喜歡它。爲了保留我們當前的日誌記錄功能,應用程序需要在應用程序啓動時創建一個新的日誌文件。日誌文件名稱中包含日期和時間戳記。目前,我已經通過XmlConfigurator配置了log4net,這很好,除了我的RollingFileAppender的文件名在配置XML文件中被硬編碼之外。配置log4net appenders通過XML文件*和*代碼

我想繼續使用XmlConfigurator,但在致電Configure()後,我想要獲取RollingFileAppender,並在代碼中將其文件值更改爲動態生成的字符串。示例documentation online似乎現在正在進行中,但我已經透過SDK參考,看起來我可以使用HeirarchyGetAppenders()來做我需要做的事情。我在正確的軌道上嗎?

好吧,我參加了一個刺在此,想下面的代碼,它沒有工作:

private static readonly ILog _log = LogManager.GetLogger(typeof(GUI)); 
// in the config file, I've set the filename to example.log, and it works 
XmlConfigurator.Configure(new FileInfo("log_config.xml")); 
Hierarchy hierarchy = LogManager.GetRepository() as Hierarchy; 
if(hierarchy != null) { 
    // get the appenders 
    IAppender[] appenders = hierarchy.GetAppenders(); 
    // change the filename for the RollingFileAppender 
    foreach(IAppender a in appenders) { 
     RollingFileAppender rfa = a as RollingFileAppender; 
     if(rfa == null) 
      continue; 
     rfa.File = "newfile.log"; // no runtime error, but doesn't work. 
    } 
} 
_log.Info("Application started"); 

回答

2

你在這種情況下,需要滾動文件附加目的地?如果沒有,我會希望你的代碼會創建所需的結果,如果你使用普通的文件appender。

編輯:如果你在appender上調用ActivateOptions(),它可能適用於RollingFile Appender。

+0

絕對正確的!謝謝! – Dave 2010-05-11 14:50:20

8

試試這個片斷:

XmlConfigurator.Configure(); 

log4net.Repository.ILoggerRepository repo = LogManager.GetRepository(); 
foreach (log4net.Appender.IAppender appender in repo.GetAppenders()) 
{ 
if (appender.Name.CompareTo("RollingFileAppender") == 0 && appender is log4net.Appender.RollingFileAppender) 
{ 
    var appndr = appender as log4net.Appender.RollingFileAppender; 
    string logPath = "MyApplication.log"; 
    appndr.File = logPath; 
    appndr.ActivateOptions(); 
} 

我貼過類似的文章here

+0

+1以實現更好的實現,不同之處在於您對Configure的調用需要指定用於配置的XML文件。 – Dave 2010-05-11 14:51:04

+0

@Dave:不,它不會調用'Configure()'將使用相關項目的'app.config'或'web.config'。 – Aren 2010-07-27 17:31:02

+0

@Aren啊,好的,謝謝你的澄清。 – Dave 2010-07-30 21:04:45