You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@logging.apache.org by "Ian Pickering (JIRA)" <ji...@apache.org> on 2018/11/01 21:02:00 UTC

[jira] [Updated] (LOG4J2-2485) SizeBasedTriggeringPolicy is not honored when using the DirectWriteRolloverStrategy if the machine restarts

     [ https://issues.apache.org/jira/browse/LOG4J2-2485?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Ian Pickering updated LOG4J2-2485:
----------------------------------
    Attachment: LOG4J2-2485.v2.patch

> SizeBasedTriggeringPolicy is not honored when using the DirectWriteRolloverStrategy if the machine restarts
> -----------------------------------------------------------------------------------------------------------
>
>                 Key: LOG4J2-2485
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-2485
>             Project: Log4j 2
>          Issue Type: Bug
>            Reporter: Giovanni Matteo Fumarola
>            Priority: Major
>         Attachments: LOG4J2-2485.v1.patch, LOG4J2-2485.v2.patch
>
>
> We are working on migrate Log4J to Log4J2 in Hadoop codebase.
> It seems like the SizeBasedTriggeringPolicy is not honored when using the DirectWriteRolloverStrategy if the machine restarts before it writes the size limit specified in the policy. We are coming across an issue where if a process using Log4j2 restarts continuously in a short time period, the size of the most recently created log will grow indefinitely.
> The behavior we expect is for the log output to always be written to the most recently created file by the RollingFile appender, and for the log file size to never exceed what was specified in the SizeBasedTriggeringPolicy.
> Our setup uses SLF4J and Log4j2 using the Log4j 1.2 API.
> In reproducing the issue locally, I took an example of the usage of the DirectWriteRolloverStrategy from [https://logging.apache.org/log4j/2.x/manual/appenders.html#TriggeringPolicies] and modified it slightly to not compress the archived files. Here is the code used.
> {code:xml}
> <?xml version="1.0" encoding="UTF-8"?>
> <Configuration status="INFO">
>   <Appenders>
>     <RollingFile name="file" filePattern="logs/app-%d\{yyyy-MM-dd-HH}-%i.log">
>       <PatternLayout>
>         <Pattern>%d %p %c\{1.} [%t] %m%n</Pattern>
>       </PatternLayout>
>       <Policies>
>         <SizeBasedTriggeringPolicy size="250 MB"/>
>       </Policies>
>       <DirectWriteRolloverStrategy maxFiles="10"/>
>     </RollingFile>
>   </Appenders>
>   <Loggers>
>     <Root level="debug">
>       <AppenderRef ref="file"/>
>     </Root>
>   </Loggers>
> </Configuration>
> {code}
>  
> {code:java}
> package com.test;
>  
> import org.slf4j.Logger;
> import org.slf4j.LoggerFactory;
>  
> public class Test {
>   private static Logger logger = LoggerFactory.getLogger(Test.class);
>  
>   public static void main(String[] args)
>   {
>     while (true)
>     {
>       logger.info("test");
>     }
>   }
> }
> {code}
>  
> First I ran this such that the log generated would be somewhere around half the size limit specified.
>  
> {code:java}
> -rw-r--r-- 1 iapicker 1049089 251M Oct 22 12:53 app-2018-10-22-12-1.log
> -rw-r--r-- 1 iapicker 1049089 121M Oct 22 12:53 app-2018-10-22-12-2.log
> {code}
>  
> Then I ran it again, and noted the file sizes generated:
>  
> {code:java}
> -rw-r--r-- 1 iapicker 1049089 251M Oct 22 12:53 app-2018-10-22-12-1.log
> -rw-r--r-- 1 iapicker 1049089 371M Oct 22 12:55 app-2018-10-22-12-2.log
> -rw-r--r-- 1 iapicker 1049089 251M Oct 22 12:56 app-2018-10-22-12-3.log
> -rw-r--r-- 1 iapicker 1049089  48M Oct 22 12:56 app-2018-10-22-12-4.log
> {code}
> Here, the second log which was 121M at the time the first run finished now exceeds the 250M limit specified in the SizeBasedTriggeringPolicy. If another 250M is written to the same file without a restart happening, the behavior becomes what we expect.
> Internally, this could be caused by the inability to specify a fileName parameter in DirectWriteRolloverStrategy, because the file specified with fileName is used for tracking the amount written to the log so far when Log4j first starts up. Otherwise, the size written so far would become zero.The Log4j version used is 2.11.0. Here is the full list of the Maven dependencies used.
> {code:java}
> <dependencies>
>     <dependency>
>       <groupId>org.apache.logging.log4j</groupId>
>       <artifactId>log4j-api</artifactId>
>       <version>2.11.0</version>
>     </dependency>
>     <dependency>
>       <groupId>org.apache.logging.log4j</groupId>
>       <artifactId>log4j-core</artifactId>
>       <version>2.11.0</version>
>     </dependency>
>     <dependency>
>       <groupId>org.apache.logging.log4j</groupId>
>       <artifactId>log4j-slf4j-impl</artifactId>
>       <version>2.11.0</version>
>     </dependency>
>     <dependency>
>       <groupId>org.apache.logging.log4j</groupId>
>       <artifactId>log4j-1.2-api</artifactId>
>       <version>2.11.0</version>
>     </dependency>
>     <dependency>
>       <groupId>org.apache.logging.log4j</groupId>
>       <artifactId>log4j-iostreams</artifactId>
>       <version>2.11.0</version>
>     </dependency>
>   </dependencies>
> {code}
>  



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)