2012-07-29 122 views

回答

4

它不支持log4net的「開箱即用」。但是,您可以使用RollingFileAppender並創建一個手動類/方法來清理/刪除日誌文件。

僅供參考,Log4Net: set Max backup files on RollingFileAppender with rolling Date

另一種方法,以避免被鎖定將通過設置最小制動水平上的日誌文件的文件:

<lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
+0

謝謝!但是當我嘗試刪除文件時,我得到一個異常,因爲log4net捕獲該文件。我如何從log4net中釋放日誌文件? – 2012-07-29 13:27:46

+1

在調用delete之前,可以使用CloseFile()方法。 – Darek 2012-07-29 13:35:37

+0

我想這是一個單獨的問題,但按照Darek的建議。讓我們知道您的工作方式,如果這對您有用,請不要忘記標記爲已回答。 – Seany84 2012-07-29 14:13:54

6

我有這個問題了。

你需要這個在你的配置:

<lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
+0

正是我在找的東西。 – cdmckay 2013-02-01 22:04:56

+0

完美!簡單,我喜歡它 – 2014-03-10 14:25:05

+0

我懷疑這帶有成本,也許有人可以在這裏發表評論。爲了這個工作Log4Net可能會關閉文件並釋放文件句柄。這是一個代價高昂的操作,因爲下一次寫入需要分配一個新的文件句柄並打開文件。雖然這可能會看到「完美」,但很可能會導致性能下降。 – Jazimov 2016-12-11 17:43:01

2

謝謝你們 我成功清除日誌。 在日誌配置文件的附加器塊我添加了一行:

<lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 

是清除日誌文件中的代碼是:

 RollingFileAppender fileAppender = LogManager.GetRepository() 
         .GetAppenders().FirstOrDefault(appender => appender is RollingFileAppender) as RollingFileAppender; 


     if (fileAppender != null && File.Exists(((RollingFileAppender)fileAppender).File)) 
     { 
      string path = ((RollingFileAppender)fileAppender).File; 
      log4net.Appender.FileAppender curAppender = fileAppender as log4net.Appender.FileAppender; 
      curAppender.File = path; 

      FileStream fs = null; 
      try 
      { 
       fs = new FileStream(path, FileMode.Create); 
      } 
      catch(Exception ex) 
      { 
       (log4net.LogManager.GetLogger(this.GetType())).Error("Could not clear the file log", ex); 
      } 
      finally 
      { 
       if (fs != null) 
       { 
        fs.Close(); 
       } 

      } 
     } 

謝謝大家

+0

看到我的回覆。我相信那是我指出你的方向。很高興你把事情解決了。 – Seany84 2012-09-11 00:01:25

1

如果你不不想受到具有最小鎖定的性能影響(請參閱answer),那麼您可以臨時配置appender使用最小鎖定,刪除文件,然後將默認行爲回來。

例如,當你只使用RollingFileAppenders:

// Release the lock on the log4net log files 
var appenders = log4net.LogManager.GetRepository().GetAppenders(); 
foreach (var appender in appenders) 
{ 
    var rollingFileAppender = appender as log4net.Appender.RollingFileAppender; 
    if (rollingFileAppender != null) 
    { 
     rollingFileAppender.ImmediateFlush = true; 
     rollingFileAppender.LockingModel = new log4net.Appender.FileAppender.MinimalLock(); 
     rollingFileAppender.ActivateOptions(); 
    } 
} 

的文件,現在可以自由地毫無問題地刪除。

0

使用簡單的命令

File.WriteAllText("C:/Users.../log.xml", ""); 

在應用程序的開始。