Подтвердить что ты не робот

Log4net - удалить старые файлы, скопированные по дате

INTENT:

a) Я хочу, чтобы мои журналы были свернуты по дате в следующем формате файла yyyy-MM-dd.txt.

b) Кроме того, я хочу удалить старые файлы из диапазона maxSizeRollBackups.

CAUTION A maximum number of backup files when rolling on date/time 
  boundaries is not supported. [RollingFileAppender spec][1]

РЕШЕНИЕ

для a) достаточно, чтобы выполнить конфигурацию

<appender name="FileAppender" type="log4net.Appender.RollingFileAppender">
  <file value="logs\" />
  <appendToFile value="true" />
  <rollingStyle value="Date" />
  <maxSizeRollBackups value="30" />
  <datePattern value="yyyy-MM-dd'.txt'" />
  <staticLogFileName value="false" />
  <layout type="log4net.Layout.XmlLayoutSchemaLog4j"/>
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
</appender>

для b) Является ли наследование от RollingFileAppender + удалять материал единственным способом достижения этого?

4b9b3361

Ответ 1

Я потратил некоторое время на изучение этого несколько месяцев назад. v1.2.10 не поддерживает удаление более старых файлов журналов на основе календаря по дате. Он находится в списке задач для следующего выпуска. Я взял исходный код и сам добавил функциональность, и разместил его для других, если они заинтересованы. Проблема и патч можно найти на https://issues.apache.org/jira/browse/LOG4NET-27.

Ответ 2

Кажется, что исправленная версия 4 RollingFileAppenderer, представленная здесь https://issues.apache.org/jira/secure/attachment/12565940/RollingFileAppender.zip, отлично работает с незначительными изменениями: в строке 1286 замените ". *" с "*".

Для этого вы можете использовать следующую конфигурацию:

<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString" value="MyProduct.log" />
  <param name="DatePattern" value="'_'yyyy-MM-dd"/>
  <param name="AppendToFile" value="true"/>
  <param name="RollingStyle" value="Date"/>
  <param name="StaticLogFileName" value="false"/>
  <param name="MaxDateRollBackups" value="3" />
  <param name="preserveLogFileNameExtension" value="true" />
  <layout type="log4net.Layout.PatternLayout">
    <param name="ConversionPattern" value="%r %d [%t] %-5p %c - %m%n"/>
  </layout>
</appender>

Ответ 3

Учитывая, что прошло более десятилетия, и он по-прежнему не поддерживается, я выбрал следующее решение переопределения RollingFileAppender с требуемой функциональностью:

public class RollingDateAppender : RollingFileAppender {
  public TimeSpan MaxAgeRollBackups { get; set; }

  public RollingDateAppender()
    : base() {
    PreserveLogFileNameExtension = true;
    StaticLogFileName = false;
  }

  protected override void AdjustFileBeforeAppend() {
    base.AdjustFileBeforeAppend();

    string LogFolder = Path.GetDirectoryName(File);
    var CheckTime = DateTime.Now.Subtract(MaxAgeRollBackups);
    foreach (string file in Directory.GetFiles(LogFolder, "*.log")) {
      if (System.IO.File.GetLastWriteTime(file) < CheckTime)
        DeleteFile(file);
    }
  }

}

Конфигурация такая же простая, как и в исходном классе:

roller = new RollingDateAppender {
  AppendToFile = true,
  File = ...;
  MaxAgeRollBackups = TimeSpan.FromDays(7),
  RollingStyle = RollingFileAppender.RollingMode.Date,
  ...
};
roller.ActivateOptions();
BasicConfigurator.Configure(roller);

Обратите внимание, что поиск *.log файлов в каталоге журнала имеет смысл только в том случае, если используется PreserveLogFileNameExtension или используется DatePattern для добавления расширения в конце имени файла. Если вам нужна другая схема именования, измените их в синхронизации.

(я использовал версию 2.0.8 log4net, более ранние версии могут не позволить переопределить необходимую функцию.)