The following is my time and size based file rolling appender
<RollingFile name="fileWriter" fileName="${LOG_DIR}/file.log"
filePattern="${ARCHIVE}/file_log.%d{yyyy-MM-dd}-%i.gz">
<PatternLayout pattern="${PATTERN}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="100 MB" />
</Policies>
</RollingFile>
To reduce the number of log files, I would like to make it rolling over by time, so that the files generated 30 days ago is automatically removed.
Could DefaultRolloverStrategy help in my case? If it doesn't, would anyone provide some suggestions? Many Thanks.
Yes, the DefaultRolloverStrategy will do what you want. You should be able to configure:
<DefaultRolloverStrategy max="30"/>
As an alternative, you can also specify a Delete action something like:
<DefaultRolloverStrategy>
<Delete basePath="${ARCHIVE}" maxDepth="2">
<IfFileName glob="*/file_log-*.gz" />
<IfLastModified age="30d" />
</Delete>
</DefaultRolloverStrategy>
Related
Helllo everyone,
we have log4j from 1.2.8 to log4j2.11, and observed half daily logs files are not generating as expected.Only i can see only AM log files are generating.
<RollingFile name="file" fileName="testAMPM.log" filePattern="testAMPM.log-%d{yyyy-MM-dd-a}" >
<PatternLayout pattern="%d %5p %-120m [%t - %c:%L] %n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
</Policies>
Will not mark this as duplicate because this, question here did not get answered. The answer to another duplicate question does have an example though, so please try this here first:
<RollingFile name="fileAppender" filename ="${logName} append="true" FilePattern="${logName}.$$d{yyyy-MM-dd-a}">
<CronTriggeringPolicy schedule="0 0 0,12 * * ?" />
</RollingFile>
A comment in the first linked duplicate also suggests to check out Cron Triggering Policy, which could provide a better solution to your requirement than a TimeBasedTriggeringPolicy:
Just try it out.
I read the official document of log4j2 and get a question about RollingFileAppender.
That's what the document says:
Below is a sample configuration that uses a RollingFileAppender with both the time and size based triggering policies, will create up to 100 archives on the same day (1-100) that are stored in a directory based on the current year and month, and will compress each archive using gzip and will roll every hour. During every rollover, this configuration will delete files that match "/app-.log.gz" and are 30 days old or older, but keep the most recent 100 GB or the most recent 10 files, whichever comes first.
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
<Properties>
<Property name="baseDir">logs</Property>
</Properties>
<Appenders>
<RollingFile name="RollingFile" fileName="${baseDir}/app.log"
filePattern="${baseDir}/$${date:yyyy-MM}/app-%d{yyyy-MM-dd-HH}-%i.log.gz">
<PatternLayout pattern="%d %p %c{1.} [%t] %m%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="250 MB"/>
</Policies>
<DefaultRolloverStrategy max="100">
<!--
Nested conditions: the inner condition is only evaluated on files
for which the outer conditions are true.
-->
<Delete basePath="${baseDir}" maxDepth="2">
<IfFileName glob="*/app-*.log.gz">
<IfLastModified age="30d">
<IfAny>
<IfAccumulatedFileSize exceeds="100 GB" />
<IfAccumulatedFileCount exceeds="10" />
</IfAny>
</IfLastModified>
</IfFileName>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>
I think this configuration will create up to 100 archives on the same hour of the day, not 100 archives on the same day, can anybody who give me a hand? Thanks!
Yes, it will keep up to 100 files in the hour but in reality it will never get that high since it is only keeping a maximum of 10 files overall.
I used the following Log4j2 configuration to test the behavior. It rotates the file every 10 seconds and should keep only 3 files. However no file is deleted. What am I missing?
Please don't suggest to use the delete action.
<RollingFile name="File" fileName="/var/log/mylog.log" filePattern="/var/log/mylog-%d{yyyy-MM-dd-HH-mm-ss}.log.gz">
<PatternLayout>
<Pattern>${LOG_PATTERN}</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="10"/>
</Policies>
<DefaultRolloverStrategy max="3"/>
</RollingFile>
I realise this is an old question, but I had the same problem.
I also realise the OP said "Please don't suggest to use the delete action" so this may mean there are version restrictions on using Delete.
However I found this feature request which sheds some light on this behaviour - a comment there indicates.
DefaultRolloverStrategy max attribute only applies if you have a %i in
the file pattern.
The manual, under "Default Rollover Strategy", indicates
The default rollover strategy accepts both a date/time pattern and an
integer from the filePattern attribute specified on the
RollingFileAppender itself
and
max : integer : "The maximum value of the counter. Once this values is
reached older archives will be deleted on subsequent rollovers. The
default value is 7."
A bit a mix of "counter" and "integer" - but think (now) that it means this only applies to "%i" pattern. If the manual used "integer counter" it may be clearer.
A solution I got working (using 2.10.0 and days rather than seconds) using Delete (sorry OP) was:
<RollingFile name="MyLog" fileName="${sys:dataDir}/mylog.log" append="true">
<FilePattern>./mylog-%d{yyyy-MM-dd}.log.zip</FilePattern>
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level - %msg %logger{36}%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
</Policies>
<DefaultRolloverStrategy>
<Delete basePath="${sys:dataDir}" maxDepth="1">
<IfFileName glob="mylog-*.log.zip" />
<IfLastModified age="7d" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile >
I've tried to add the following RollingFile appender;
<RollingFile name="appFile" fileName="${sys:catalina.base}${sys:file.separator}logs${sys:file.separator}${web:contextPath}${sys:file.separator}app.log" filePattern="app-%d{dd-MM-yyyy}.log">
<PatternLayout pattern="%d{dd/MM/yyyy HH:mm:ss} %c{2} - %m%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="250 MB" />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingFile>
The file is created in the correct path but the name is always the same (app.log) instead of app-xx-xx-xxxx.log.
What do I miss?
The filePattern attribute is the pattern of the file name to use on rollover. But if you want the date pattern in the name of the file that is actively written tom, you can use Date Lookup in the filename attribute, i.e:
fileName="${sys:catalina.base}${sys:file.separator}logs${sys:file.separator}${web:contextPath}${sys:file.separator}app-${date:dd-MM-yyyy}.log"
I have a RollingFile appender
<RollingFile name="xxx" fileName="${sys:catalina.base}/logs/request.log" filePattern="${sys:catalina.base}/logs/request.log.%d{yyyy-MM-dd}.%i.gz">
<PatternLayout>
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %msg%n</Pattern>
</PatternLayout>
<Policies>
<OnStartupTriggeringPolicy />
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="5 MB"/>
</Policies>
<MarkerFilter marker="REQUEST_MARKER" onMatch="ACCEPT" onMismatch="DENY"/>
</RollingFile>
Which works perfect but this weekend at 14.02 and 15.02. the logger did not log anything after midnight between 00:00:00 and 03:39:17 and at 15.02. between 00:00:00 and 03:18:59.
Can anyone imagine why?
Btw: the application was okay, as I received data in other logfiles.
Regards
S.
The title of your question is about not rolling over but your question makes it sound like you are asking why no logs were written during certain times, so I am not sure if I am answering your question.
The RollingFileAppender only checks for a rollover when it writes events. If no log event occurs between midnight and 3:18 am then the file will not roll over until 3:18 am.