Nové nastavení PreserveLogFileNameExtension u log4net RollingFileAppenderu

V nové verzi log4net knihovny byl přidán konfigurovatelný parametr PreserveLogFileNameExtension u RollingFileAppenderu. Tím by mělo jít nastavit formát jména starších archivovaných log souborů tak, aby byla vždy zachována jejich přípona. Konfigurace log4net může vypadat například takto:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  </configSections>
  <log4net>
    <appender name="File" type="log4net.Appender.RollingFileAppender">
      <file value="Application.log"/>
      <appendToFile value="true"/>
      <rollingStyle value="Size"/>
      <maxSizeRollBackups value="-1"/>
      <maximumFileSize value="100KB"/>
      <datePattern value="yyyyMMdd"/>
      <preserveLogFileNameExtension value="true"/>
      <filter type="log4net.Filter.LevelRangeFilter">
        <acceptOnMatch value="true"/>
        <levelMin value="DEBUG"/>
        <levelMax value="FATAL"/>
      </filter>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date %-5level [%property] %logger - %message%newline"/>
      </layout>
    </appender>
    <root>
      <level value="ALL"/>
      <appender-ref ref="File"/>
    </root>
  </log4net>
</configuration>

Jednotlivé log soubory rozdělené podle velikosti jsou pak pojmenovány takto:

Application.log
Application.1.log
Application.2.log


Funguje to ale i pro Date a Composite režim ?

Stejně tak bych očekával, že to bude fungovat i pro souboru archivované po dnech, viz nastavení Composite nebo Date u RollingStyle. Zde je zdá se bohužel chyba, protože pro archivované soubory pojmenované podle datumu to nefunguje a datum je stále připojen na konec názvu souboru Frown Podle tohoto by to však fungovat mělo. Výsledek vypadá takto:

Application.log
Application.log.20120406
Application.1.log
Application.1.log.20120406

Workaround

Jako workaround je možné stále použít již známý způsob pomocí úpravy DatePattern na:

<datePattern value="yyyyMMdd'.log'"/>

Kde získáme alespoň takový výsledek:

Application.log
Application.1.log 
Application.log20120406.log 
Application.log20120406.1.log 

Pro úplnost ještě testovací kód:

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

namespace Log4NetTest
{
  class Program
  {
    private static readonly ILog log = LogManager.GetLogger(typeof(Program));

    private static void MakeThemOlder()
    {
      foreach (string logFileName in Directory.EnumerateFiles(Directory.GetCurrentDirectory(), "Application*.*", SearchOption.TopDirectoryOnly))
      {
        DateTime fileTime = File.GetCreationTime(logFileName).AddDays(-1);
        File.SetCreationTime(logFileName, fileTime);
        File.SetLastAccessTime(logFileName, fileTime.AddSeconds(20));
        File.SetLastWriteTime(logFileName, fileTime.AddSeconds(20));
      }
    }

    static void Main(string[] args)
    {
      MakeThemOlder();
      XmlConfigurator.Configure();
      for (int i = 0; i < 5000; i++)
        log.DebugFormat("Test log {0}", i);
      LogManager.Shutdown();
    }
  }
}



Komentáře jsou uzavřeny