2014-10-09 101 views
7

我想配置log4net以使所有前一天的日誌都應該自動歸檔。是否有可能在Log4Net中自動歸檔先前的日誌。我希望僅使用配置來完成此操作,而無需使用任何第三方庫(如sharplibzip)編寫任何代碼來創建歸檔文件。如何使用Log4Net實現日誌文件的自動歸檔

通過歸檔添加的另一件事我的意思是壓縮zip/rar格式的文件以節省磁盤空間。

回答

2

log4net不包含任何壓縮日誌文件的功能。然而,壓縮是在.Net框架中(自4.5開始),或者您可以使用the Windows Shell API壓縮文件,因此您將擁有定期獲取所有不是當前日誌文件的日誌文件並將其壓縮的代碼:

-- assuming you don't have more that one appender 
appender = LogManager.GetRepository().GetAppenders() 
        .OfType<RollingFileAppender>().FirstOrDefault(); 

if (appender == null) return; // no appenders found 

var currentFile = appender.File; 

-- dropping to pseudocode: 
var files = Get_all_files_in_log_directory_which_match_log_file_pattern 
     but_aren't_the_current_file(current file); 

if (ZipFiles(files...)) 
    (DeleteFiles(files); // presumably 
4

如果不編寫代碼就不可能存檔文件,對不起。但是代碼不會很複雜。

您可以創建一個繼承自RollingFileAppender的自定義appender,並覆蓋AdjustFileBeforeAppend方法以向滾動文件添加行爲。以下是現有的方法,用於滾動RollingFileAppender的文件,您可以覆蓋該文件以添加歸檔。

使用File屬性查找的文件名過程中它

// log4net.Appender.RollingFileAppender 
protected virtual void AdjustFileBeforeAppend() 
{ 
    var fileToZip = File; // save the current file 
    if (this.m_rollDate) 
    { 
     DateTime now = this.m_dateTime.Now; 
     if (now >= this.m_nextCheck) 
     { 
      this.m_now = now; 
      this.m_nextCheck = this.NextCheckDate(this.m_now, this.m_rollPoint); 
      this.RollOverTime(true); 
      // zip the file if roll occurs here 
     } 
    } 
    if (this.m_rollSize) 
    { 
     if (this.File != null && ((CountingQuietTextWriter)base.QuietWriter).Count >= this.m_maxFileSize) 
     { 
      this.RollOverSize(); 
      // zip the file if roll occurs here 
     } 
    } 
} 

或者你可以找到一個現有的appender,你想要做什麼,但我不知道有什麼。


我冒昧地將@ stuartd的評論解釋爲答案,因爲他提出的是非常優雅的。你可以簡單地覆蓋AdjustFileBeforeAppend這樣:

protected override void AdjustFileBeforeAppend() { 
    var previousFile = File; 
    base.AdjustFileBeforeAppend(); 
    if (File != previousFile) { // zip the file } 
} 

這是做的相當簡潔的方式,但你可能希望能夠既樣卷(即日期和大小)來區分。例如,僅在日期滾動上進行壓縮才能將日期範圍內的文件保存在一起。

+4

爲了避免必須更換這是不是從長遠來看,最好的主意現有方法的代碼,這是可以做到這樣的: 保護覆蓋無效AdjustFileBeforeAppend(){ VAR = previousFile文件; base.AdjustFileBeforeAppend(); if(File!= previousFile) { // zip文件 } } – stuartd 2014-10-10 09:38:09

+0

這是一個非常好的主意!我認爲區分大小滾動和日期滾動並不會造成傷害,因爲您可能想要將文件同一天壓縮到一起。太糟糕了,我們不能評論代表 – samy 2014-10-10 09:40:59

+2

log4net是受log4j啓發。 log4j的後繼者稱爲logback,並在配置中內置了壓縮,因此它完全符合您(和我)的要求。現在我們只需要一些靈感團隊來編寫logback.NET! – 2015-09-21 13:06:27

0

這是我使用DotNetZip的解決方案。

public class CustomRollingFileAppender : RollingFileAppender 
    { 
     protected override void AdjustFileBeforeAppend() 
     { 
      var currentFile = File; 

      FileInfo fa = new System.IO.FileInfo(currentFile); 

      if (fa.Length >= 10000000) 
      { 
       using (ZipFile zip = new ZipFile(File + ".zip")) 
       { 
        string newFile = DateTime.Now.ToString("HHmmss") + fa.Name; 
        zip.AddFile(File).FileName = newFile; 
        zip.Save(File + ".zip"); 
       } 
      } 

      base.AdjustFileBeforeAppend(); 
     } 
    } 
+1

工作解決方案,但在我看來,由於爲每個write.samys解決方案調用FileInfo會產生惡夢般的性能開銷似乎更加友好;-) – 2015-06-25 10:33:52