Log4j keeps writing to rotated deleted log file

Viewed 135

Log rotation is not behaving as expected for a java service which has log4j version 2.13.3 integrated.

As per my understanding, service should keep writing to myservice.log. When config thresholds are met, the log file should get rotated, then gzipped and then the rotated file should get deleted.

But in this case, at times, the service process keeps writing to a rotated deleted file like myservice.log.5 along with writing to myservice.log. Writing to myservice.log.5 doesn't stop until service process is stopped, thereby leading to disk space issues.

$ sudo lsof / | grep deleted
java      19157       myuser    1w   REG  254,1 4578098674 138749 /var/log/myservice/myservice.log.5 (deleted)
java      19157       myuser    2w   REG  254,1 4578098674 138749 /var/log/myservice/myservice.log.5 (deleted)

Here 19157 is the pid of java service.

Content of log4j.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="60" status="WARN">

    <Properties>
        <Property name="LOG_DIR">/var/log/myservice</Property>
        <Property name="console.log.pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} &quot;%X{X-Request-ID}&quot; &quot;%X{url}&quot; %level %c{1.1} %t %msg%n</Property>
        <Property name="info.log.pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} &quot;%X{X-Request-ID}&quot; &quot;%X{url}&quot; %level %t %c{1.1} %msg%n</Property>
        <Property name="error.log.pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} &quot;%X{X-Request-ID}&quot; &quot;%X{url}&quot; %level %t %c{1.1} %msg%n%rEx</Property>
        <Property name="default.size">100 MB</Property>
    </Properties>

    <Appenders>

        <Console name="STDOUT" target="SYSTEM_OUT">
            <PatternLayout pattern="${console.log.pattern}"/>
        </Console>

        <RollingRandomAccessFile
            name="InfoLog"
            fileName="${LOG_DIR}/myservice.log"
            filePattern="${LOG_DIR}/myservice.log.%i.gz"
            immediateFlush="false">
            <PatternLayout pattern="${info.log.pattern}"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="${default.size}"/>
            </Policies>
            <DefaultRolloverStrategy max="5"/>
        </RollingRandomAccessFile>

        <RollingRandomAccessFile
            name="ErrorLog"
            fileName="${LOG_DIR}/error.log"
            filePattern="${LOG_DIR}/error.log.%i.gz"
            immediateFlush="false">
            <PatternLayout pattern="${error.log.pattern}"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="${default.size}"/>
            </Policies>
            <DefaultRolloverStrategy max="5"/>
        </RollingRandomAccessFile>

    </Appenders>

    <Loggers>

        <Root level="INFO">
            <AppenderRef ref="InfoLog" level="INFO"/>
            <AppenderRef ref="ErrorLog" level="ERROR"/>
        </Root>

        <Logger name="ConsoleLog" level="DEBUG" additivity="false">
            <Appender-ref ref="STDOUT"/>
        </Logger>

    </Loggers>
</Configuration>

Can someone help with why service is still writing to deleted file myservice.log.5 and how to fix this?

0 Answers
Related