2008-09-18 53 views
55

我有以下配置,但我無法找到任何關於如何設置日期滾動樣式的最大備份文件的文檔。我知道你可以通過使用maxSizeRollBackups來使用滾動樣式。Log4Net:在RollingFileAppender上滾動設置Max備份文件日期

<appender name="AppLogFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="mylog.log" /> 
    <appendToFile value="true" /> 
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
    <rollingStyle value="Date" /> 
    <datePattern value=".yyMMdd.'log'" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%d %-5p %c - %m%n" /> 
    </layout> 
</appender> 
+0

+1正是我在找的 – 2009-07-10 16:21:22

回答

4

不確定您確實需要什麼。以下是我的一個lo4net.config文件的摘錄:

<appender name="RollingFile" type="log4net.Appender.RollingFileAppender"> 
    <param name="File" value="App_Data\log"/> 
    <param name="DatePattern" value=".yyyy-MM-dd-tt&quot;.log&quot;"/> 
    <param name="AppendToFile" value="true"/> 
    <param name="RollingStyle" value="Date"/> 
    <param name="StaticLogFileName" value="false"/> 
    <param name="maxSizeRollBackups" value="60" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <param name="ConversionPattern" value="%r %d [%t] %-5p %c - %m%n"/> 
    </layout> 
    </appender> 
+1

不確定爲什麼投票表決,它被認爲是一種很好的形式來解釋爲什麼我們都可以學習 – wcm 2014-01-21 01:07:13

+3

的確似乎錯過了這個問題的重點,maxSizeRollBackups不允許你例如刪除超過10天的文件,我相信這是OP正在嘗試的事情 實現。 – 2014-02-04 13:36:10

+0

我想你是正確的,這是OP想要的。我當時有點不清楚他當時想要完成什麼。我的回答很簡單,並試圖向他展示我的代碼。我仍然會以相同的方式回答這些問題,試圖提供幫助,但我可以看到你的投票來自哪裏。 – wcm 2014-02-11 13:41:46

40

您不能。

log4net SDK Reference
RollingFileAppender Class

注意

日期/時間界限滾動時的備份文件的最大數目是不支持的。

+3

更新它與maxSizeRollBackups支持:http://logging.apache.org/log4net/release/sdk/log4net.Appender.RollingFileAppender.MaxSizeRollBackups.html – schoetbi 2014-03-25 15:02:34

11

幾個月前我花了一些時間來看這個。 v1.2.10不支持根據日期滾動刪除較早的日誌文件。它位於下一個版本的任務列表中。我採用了源代碼並自己添加了這些功能,並且如果他們感興趣,則將其發佈給其他人。問題和補丁可以在https://issues.apache.org/jira/browse/LOG4NET-27找到。

34

即使它不支持的,這裏是我如何處理這樣的情況:

這是我的配置:

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> 
     <file value="C:\logs\LoggingTest\logfile.txt" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Composite" /> 
     <datePattern value="yyyyMMdd" /> 
     <maxSizeRollBackups value="10" /> 
     <maximumFileSize value="1MB" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%date - %message%newline" /> 
     </layout> 
    </appender> 

在應用程序啓動起來,我做的事:

XmlConfigurator.Configure(); 
var date = DateTime.Now.AddDays(-10); 
var task = new LogFileCleanupTask(); 
task.CleanUp(date); 

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 

using log4net; 
using log4net.Appender; 
using log4net.Config; 

    public class LogFileCleanupTask 
    { 
     #region - Constructor - 
     public LogFileCleanupTask() 
     { 
     } 
     #endregion 

     #region - Methods - 
     /// <summary> 
     /// Cleans up. Auto configures the cleanup based on the log4net configuration 
     /// </summary> 
     /// <param name="date">Anything prior will not be kept.</param> 
     public void CleanUp(DateTime date) 
     { 
      string directory = string.Empty; 
      string filePrefix = string.Empty; 

      var repo = LogManager.GetAllRepositories().FirstOrDefault(); ; 
      if (repo == null) 
       throw new NotSupportedException("Log4Net has not been configured yet."); 

      var app = repo.GetAppenders().Where(x => x.GetType() == typeof(RollingFileAppender)).FirstOrDefault(); 
      if (app != null) 
      { 
       var appender = app as RollingFileAppender; 

       directory = Path.GetDirectoryName(appender.File); 
       filePrefix = Path.GetFileName(appender.File); 

       CleanUp(directory, filePrefix, date); 
      } 
     } 

     /// <summary> 
     /// Cleans up. 
     /// </summary> 
     /// <param name="logDirectory">The log directory.</param> 
     /// <param name="logPrefix">The log prefix. Example: logfile dont include the file extension.</param> 
     /// <param name="date">Anything prior will not be kept.</param> 
     public void CleanUp(string logDirectory, string logPrefix, DateTime date) 
     { 
      if (string.IsNullOrEmpty(logDirectory)) 
       throw new ArgumentException("logDirectory is missing"); 

      if (string.IsNullOrEmpty(logPrefix)) 
       throw new ArgumentException("logPrefix is missing"); 

      var dirInfo = new DirectoryInfo(logDirectory); 
      if (!dirInfo.Exists) 
       return; 

      var fileInfos = dirInfo.GetFiles("{0}*.*".Sub(logPrefix)); 
      if (fileInfos.Length == 0) 
       return; 

      foreach (var info in fileInfos) 
      { 
       if (info.CreationTime < date) 
       { 
        info.Delete(); 
       } 
      } 

     } 
     #endregion 
    } 

Sub方法是一個Exten錫永法,它基本上包裝的String.Format像這樣:

/// <summary> 
/// Extension helper methods for strings 
/// </summary> 
[DebuggerStepThrough, DebuggerNonUserCode] 
public static class StringExtensions 
{ 
    /// <summary> 
    /// Formats a string using the <paramref name="format"/> and <paramref name="args"/>. 
    /// </summary> 
    /// <param name="format">The format.</param> 
    /// <param name="args">The args.</param> 
    /// <returns>A string with the format placeholders replaced by the args.</returns> 
    public static string Sub(this string format, params object[] args) 
    { 
     return string.Format(format, args); 
    } 
} 
0

它很容易從一個log4net的appender的繼承和補充說,執行清理的文件你自己的覆蓋方法。我重覆OpenFile來做到這一點。下面是一個自定義log4net appender的例子,以幫助您入門:https://stackoverflow.com/a/2385874/74585

1

我最近遇到這種需求時,試圖根據傳遞給我的服務的maxAgeInDays配置值來清理日誌日誌......很多人在我之前,我開始暴露於NTFS的'特性'隧道,這使得使用FileInfo.CreationDate成爲問題(儘管我自此也解決了這個問題)...

因爲我有一個模式要走,所以我決定只是滾動我自己的清理方法...我的記錄器是以編程方式配置的,所以我只需在記錄器安裝完成後調用以下內容...

//......................... 
    //Log Config Stuff Above... 

    log4net.Config.BasicConfigurator.Configure(fileAppender); 
    if(logConfig.DaysToKeep > 0) 
     CleanupLogs(logConfig.LogFilePath, logConfig.DaysToKeep); 
} 

static void CleanupLogs(string logPath, int maxAgeInDays) 
{ 
    if (File.Exists(logPath)) 
    { 
     var datePattern = "yyyy.MM.dd"; 
     List<string> logPatternsToKeep = new List<string>(); 
     for (var i = 0; i <= maxAgeInDays; i++) 
     { 
      logPatternsToKeep.Add(DateTime.Now.AddDays(-i).ToString(datePattern)); 
     } 

     FileInfo fi = new FileInfo(logPath); 

     var logFiles = fi.Directory.GetFiles(fi.Name + "*") 
      .Where(x => logPatternsToKeep.All(y => !x.Name.Contains(y) && x.Name != fi.Name)); 

     foreach (var log in logFiles) 
     { 
      if (File.Exists(log.FullName)) File.Delete(log.FullName); 
     } 
    } 
} 

也許不是最漂亮的方法,但相當不錯的了我們的目的...

6

要限制日誌的數量,不包括在datepattern年或月,e.g。 datePattern值=「_ dd」。登錄'」

這將創建一個新的每一天日誌,並打算下個月覆蓋

1

NLog,所設置的是幾乎相同的方式log4net的(&積極維持 - 甚至有支持.NET Core),支持基於日期的滾動日誌。

相關問題