log4net generates wrong log file name after rolling log files

933 Views Asked by At

Basically I have this config for log4net:

<?xml version="1.0" encoding="utf-8"?>
<log4net>
  <root>
    <level value="INFO" />
    <appender-ref ref="RollingFileAppenderWithDeletion" />
  </root>
  <appender name="RollingFileAppenderWithDeletion" type="Namespace.RollingFileAppenderWithDeletion">
    <file type="log4net.Util.PatternString" value="Logs/%property{LogName}/log.%property{ServiceName}-PID-%processid_%date{yyyyMMdd}.log" />
    <appendToFile value="true" />
    <rollingStyle value="Date" />
    <datePattern value="yyyyMMMdd" />
    <maxSizeRollBackups value="10" />
    <maximumFileSize value="50MB" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%-5level %date{dd MMM yyyy HH:mm:ss,ffff} [%thread] %exception - %message%newline"/>
    </layout>
  </appender>
</log4net>

Now I have a problem. Everytime log4net rolls log file, it doesn't change the date part of log file. For example if today's log file is - log.MyServiceName-PID-1234_20131208.log, tomorrow after rolling the file, name of the file won't change, so I will end up having a rolled back log file and active log file like this

  1. log.QAService-PID-17584_20131208.log
  2. log.QAService-PID-17584_20131208.log2013Dec08

What I would like to have is

  1. log.QAService-PID-17584_20131209.log - active log file
  2. log.QAService-PID-17584_20131208.log2013Dec08 - rolled back

Now I came across this post, but it didn't help me. In particular, if I remove date pattern from file, and set preserveLogFileNameExtension to true, I can't see date part on active log file anymore. If I go further and set staticLogFileName to false, I don't have active log files anymore, instead active log files are having the rolled back log file name pattern.

What am I missing here? How can I have right log file names generated after roll back.

I'm using log4net version 1.2.10.0. Unfortunately I can't upgrade it to newer version.

Update This is custom implementation of RollingFileAppenderWithDeletion. It just cleans up old rolled back files after log file rolling took place.

public class RollingFileAppenderWithDeletion :RollingFileAppender
    {
        private IFileBurner m_fileBurner;
        private const int checkMinutes = 1664;
        public RollingFileAppenderWithDeletion()
        {
            m_fileBurner = FileBurner.Instance;

        }

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

            string path = base.File;
            string directoryPath = Path.GetDirectoryName(path);

            IDeletionRequirements requirements = new DeletionRequirements();
            requirements.CheckEveryMinutes = checkMinutes;
            requirements.DayLimit = MaxSizeRollBackups;
            requirements.Directories = new List<string> { directoryPath };

            m_fileBurner.ClearLogFiles(requirements);

        }
    }
1

There are 1 best solutions below

3
On

You are using the type Namespace.RollingAppenderWithDeletion, which is definately not a standard appender. Try use the type log4net.Appender.RollingFileAppender and see if that works. When you use your custom appender you need to post some code, or find why the filename code is not called.