Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to delete old logs with log4j2

( F.Y.I. I already searched out many documents in Internet. I'm using storm-0.10.0-beta1. Configuration file of log4j2 in Storm is worker.xml )

Now, I try to use log4j2.

I'm searching out way of deleting old logs but I cannot find out. Part of configuration is like below.

    <RollingFile name="SERVICE_APPENDER"
             fileName="${sys:storm.home}/logs/${sys:logfile.name}.service"
             filePattern="${sys:storm.home}/logs/${sys:logfile.name}.service.%d{yyyyMMdd}">
        <PatternLayout>
            <pattern>${pattern}</pattern>
        </PatternLayout>
        <Policies>
            <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
        </Policies>
        <DefaultRolloverStrategy max="9"/>
    </RollingFile>

At first, I expected that log files which are older than 3 days are removed.

But, actually, it doesn't.

So, I wonder whether there is a way to remove old logs or not.

If there is a way which I didn't catch yet, please notify me.

like image 554
obanadingyo Avatar asked Oct 20 '15 13:10

obanadingyo


2 Answers

Since 2.5, Log4j supports a custom Delete action that is executed on every rollover.

You can control which files are deleted by any combination of:

  1. Name (matching a glob or a regex)
  2. Age ("delete if 14 days old or older")
  3. Count ("keep only the most recent 3")
  4. Size ("keep only the most recent files up to 500MB")

Users who need even more fine-grained control over which files to delete can specify a script condition using any supported JSR-223 scripting language.

Please check out the documentation, it has three full examples that may be useful.

For your question, this snippet should work:

<RollingFile name="rollingFile" 
      fileName="/path/app.log"
      filePattern="/path/app.%d{yyyy-MM-dd}.log"
      ignoreExceptions="false">
. . .
      <DefaultRolloverStrategy>
        <!--
          * only files in the log folder, no sub folders
          * only rolled over log files (name match)
          * only files that are 4 days old or older
        -->
        <Delete basePath="${sys:storm.home}/logs/" maxDepth="1">
          <IfFileName glob="*.service.????????" />
          <IfLastModified age="4d" />
        </Delete>
      </DefaultRolloverStrategy>
 . . .

<RollingFile>

Finally, be careful! There is no way to recover files deleted this way. :-)

like image 174
Remko Popma Avatar answered Sep 20 '22 02:09

Remko Popma


You can find more background information in this JIRA entry for log4j:

https://issues.apache.org/jira/browse/LOG4J2-524

It seems to be the case that auto deleting old log files does not work when you only use a TimeBasedTriggeringPolicy

like image 35
Marged Avatar answered Sep 21 '22 02:09

Marged