Sunday, February 13, 2011

How do I configure a RollingFileAppender to roll by date and size with log4net?

I am configure log4net to use a composite RollingFileAppender so that the current file is always named logfile.log and all subsequent files are named logfile-YYYY.MM.dd.seq.log where seq is the sequence number if a log exceeds a certain size within a single day. Unfortunately, I have had very little success in configuring such a setup.

Edit:

My current configuration is pasted below. It has been updated based on several answers which gets me close enough for my needs. This generates files of the format: logfile_YYYY.MM.dd.log.seq

<log4net>

 <root>
  <level value="DEBUG" />
  <appender-ref ref="RollingFileAppender" />
 </root>

 <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
  <file value="logs\\logfile"/>
  <staticLogFileName value="false"/>
  <appendToFile value="true"/>
  <rollingStyle value="Composite"/>
  <datePattern value="_yyyy.MM.dd&quot;.log&quot;"/>
  <maxSizeRollBackups value="10"/>
  <maximumFileSize value="75KB"/>
  <layout type="log4net.Layout.PatternLayout">
   <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/>
  </layout>
  <filter type="log4net.Filter.LevelRangeFilter">
   <param name="LevelMin" value="DEBUG" />
   <param name="LevelMax" value="FATAL" />
  </filter>
 </appender>

</log4net>

One interesting note, setting

<staticLogFileName value="false"/>

to true causes the logger to not write any files.

  • According to log4net RollingFileAppender source code:

    protected string GetNextOutputFileName(string fileName)
    {
        if (!m_staticLogFileName) 
        {
            fileName = fileName.Trim();
    
            if (m_rollDate)
            {
                fileName = fileName + m_now.ToString(m_datePattern, System.Globalization.DateTimeFormatInfo.InvariantInfo);
            }
    
            if (m_countDirection >= 0) 
            {
                fileName = fileName + '.' + m_curSizeRollBackups;
            }
        }
    
        return fileName;
    }
    

    So I'm guessing it's not possible to generate a log file with the name you need. I think it's something like logfileYYYY-MM-dd.n.log or similar.

  • We use the following (in Log4J):

    <appender name="roller" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="Applog.log"/>
        <param name="DatePattern" value="'.'yyyy-MM-dd"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="[slf5s.start]%d{DATE}[slf5s.DATE]%n%p[slf5s.PRIORITY]%n%x[slf5s.NDC]%n%t[slf5s.THREAD]%n%c[slf5s.CATEGORY]%n%l[slf5s.LOCATION]%n%m[slf5s.MESSAGE]%n%n"/>
        </layout>
    </appender>
    

    This gives us Applog.log.yyyy-MM-dd files

    From paul
  • Note that is this case the

                <maxSizeRollBackups value="10"/>
    

    will be ignored.

    See this answer to a similar log4net question

    From rathkopf

0 comments:

Post a Comment