How to configure log4j to only keep log files for the last seven days?

log4j2 now has support to delete old logs.

Take a look at DefaultRolloverStrategy tag and at the snippets below.

It

  • creates up to 10 archives on the same day,

  • will parse the ${baseDir} directory that you define under the Properties tag at max depth of 2 with log filename matching "app-*.log.gz"

  • delete logs older than 7 days but keep the most recent 5 logs if your most recent 5 logs are older than 7 days.

    <DefaultRolloverStrategy max="10">
      <Delete basePath="${baseDir}" maxDepth="2">
        <IfFileName glob="*/app-*.log.gz">
          <IfLastModified age="7d">
            <IfAny>
              <IfAccumulatedFileCount exceeds="5" />
            </IfAny>
          </IfLastModified>
        </IfFileName>
      </Delete>
    </DefaultRolloverStrategy>
    

A good debug option is if you set:

<Configuration status="trace">

and use testMode Option like this:

        <DefaultRolloverStrategy>
          <Delete basePath="${baseDir}" testMode="true">
            <IfFileName glob="*.log" />
            <IfLastModified age="7d" />
          </Delete>
        </DefaultRolloverStrategy>
        

You can see in console log what files would get deleted without deleting the files right away.


You can perform your housekeeping in a separate script which can be cronned to run daily. Something like this:

find /path/to/logs -type f -mtime +7 -exec rm -f {} \;

I assume you're using RollingFileAppender? In which case, it has a property called MaxBackupIndex which you can set to limit the number of files. For example:

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=7
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

According to the following post, you can't do this with log4j: Use MaxBackupIndex in DailyRollingFileAppender -log4j

As far as I know, this functionality was supposed to make it into log4j 2.0 but that effort got sidetracked. According to the logback website, logback is the intended successor to log4j so you might consider using that.

There's an API called SLF4J which provides a common API to logging. It will load up the actual logging implementation at runtime so depending on the configuration that you have provided, it might use java.util.log or log4j or logback or any other library capable of providing logging facilities. There'll be a bit of up-front work to go from using log4j directly to using SLF4J but they provide some tools to automate this process. Once you've converted your code to use SLF4J, switching logging backends should simply be a case of changing the config file.