log4net - удаляет старые файлы по дате - PullRequest
14 голосов
/ 18 февраля 2010

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>

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

Ответы [ 3 ]

7 голосов
/ 03 марта 2010

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

2 голосов
/ 22 ноября 2017

Учитывая, что прошло более десяти лет, и это все еще не поддерживается, я выбрал следующее решение переопределения 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, более ранние версии не позволяли переопределить необходимую функцию.)

1 голос
/ 01 августа 2013

Кажется, что версия патча 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...