I configured log4j2 with Policy of TimeBasedTriggeringPolicy, by which I expect that the log file can be rolled into a zip file every day at 00:00. But it doesn't happen.
<RollingFile name="RollingFile" ignoreExceptions="false" fileName="${log.file.dir}/aaa.log" filePattern="${log.file.dir}/$${date:yyyy-MM}/aaa-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS}:%4p %t (%F:%L) - %m%n" />
<Policies>
<OnStartupTriggeringPolicy />
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="128 MB" />
</Policies>
<DefaultRolloverStrategy max="1000"/>
</RollingFile>
And when I add a class like as follows, the system creates a zip file every day at 3:15.
#Component
public class Scheduler {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
#Scheduled(cron="0 15 3 * * ?") //3:15 every day
public void doSomething() {
logger.info("3:15 every day");
}
}
It is quiet weird that the log4j2 rollup mechanism is impacted by the Spring #Schedule annotation, isn't it? Anyone knows how I can avoid this from happening? Thanks!
How often are you writing log records? The time based triggering policy only rolls over during the process of logging an event. The cron triggering policy uses a scheduler and performs the rollover from a thread so doesn't need an event to be logged to trigger it.
Related
I have a commerical product, using log4j2 internally.
I can add java/groovy script as an internal api. Here I can also use log4j2 as logger
Each script is running within a thread.
The logging for each of the scripts, I want have a own logfile (and all subordinate loggers)
Before I start within the product, I was playing with Log4J2 locally, using the RoutingAppender examples.
RoutingAppender: it works as expected when I have a log4j2.xml during startup.
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Appenders>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout
pattern="myCONSOLE - [%d] [%-5p] [%-7t] - %m%n" />
</Console>
<Routing name="Routing">
<Routes pattern="$${ctx:ROUTINGKEY}">
<Route>
<RollingFile name="Rolling-${ctx:ROUTINGKEY}"
fileName="logs/test-${ctx:ROUTINGKEY}.log"
filePattern="./logs/test-${ctx:ROUTINGKEY}-%d{yyyyMMdd}-%i.log.gz">
<PatternLayout>
<pattern>%d{ISO8601} [%t] %p %c{3} - %m%n</pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="6"
modulate="true" />
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
</RollingFile>
</Route>
</Routes>
</Routing>
</Appenders>
<Loggers>
<Root level="ALL">
<AppenderRef ref="STDOUT" />
<AppenderRef ref="Routing" />
</Root>
</Loggers>
</Configuration>
In the code I use parts as:
In the script script (simulated), I do ThreadContext.put("ROUTINGKEY", "exampleA"); , in a second script I use "exampleB".
In main programm I set:
static {
System.setProperty("isThreadContextMapInheritable", "true"); // So all objects/loggers in same thread will inherit the ThreadC
}
Other classes/objects are created as usual with normal logger technique: private static Logger logger = LogManager.getLogger(Grassfrosch.class);; and using logger.info....
All logging was in correct logfile including the subordinate elements.
Back to the commerical product. Here I want to add the RoutingAppender (and the RollingFileAppender) dynamically with programming code in the groovy scripts.
Script "exampleA" should add the route for the own part by itself
Script "exampleB" should add the route for the own part by itself
I don't want to use the product config file itself due to product upgrades/patches, overwritten by the manufacturer.
So, I also implemented locally such logic "programmatically approach".
I create a FileAppender/RollingFileAppender
I create a Routes plus Route(s) object
I create a RoutingAppender, adding the routes etc.
Simplified code is:
private void fragment() {
Configuration cfg;
org.apache.logging.log4j.core.Logger rl = (org.apache.logging.log4j.core.Logger) LogManager.getRootLogger();
cfg = rl.getContext().getConfiguration();
String name = "exampleA";
PatternLayout layout = PatternLayout.newBuilder().withPattern("DYNAMIC[" + name + "] - %d [%p] - %m%n").build();
FileAppender fileAppender = FileAppender.newBuilder() //
.setName("FileAppender-" + name).withFileName("logs/FileAppender-" + name + ".log") //
.withAppend(true).setLayout(layout) //
// .setConfiguration(cfg)
.build();
fileAppender.start();
rl.addAppender(fileAppender);
Route route01 = Route.createRoute("FileAppender-" + name , name, null);
Routes routes = Routes.newBuilder().withPattern("$${ctx:ROUTINGKEY}").withRoutes(new Route[] { route01}).build();
RoutingAppender routingAppender = RoutingAppender.newBuilder().setName("EPI-Routing").withRoutes(routes) //
.setConfiguration(cfg) //
.build();
routingAppender.start();
rl.addAppender(routingAppender);
rl.getContext().updateLoggers();
}
With this code, both scripts "exampleA" and "exampleB", will written to both logfiles "FileAppender-exampleA" and "FileAppender-exampleB" and not as expected in the "log4j2.xml" example.
I guess, the problem is:
I have to add a FileAppender to existing configuration
due to I have to "reference" Route.createRoute.
Finally the FileAppender I have added to rootlogger (wrong).
I also try to add to script logger, but no success.
I stuck. Any hints?
Uwe
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 want to generate half-daily log files through log4j2 configuration. I have given :
<RollingFile name="fileAppender" filename ="${logName} append="true"
FilePattern="${logName}. %d{yyyy-MM-dd-a}">
And also defined:
<Policies>
<TimeBasedTriggeringPolicy interval="1"
Module="true"/>
But i am getting only AM log in this way though i want it to be something :
a.log.2016-03-23-AM
b.log.2016-03-23-PM
Can somebody help me out in the same?
You can use the CronTriggeringPolicy for this. I borrowed the expression from the answer at Cron Expression (Quartz) for a program to run every midnight at 12 am for the actual expression to use.
<RollingFile name="fileAppender" filename ="${logName} append="true" FilePattern="${logName}.$$d{yyyy-MM-dd-a}">
<CronTriggeringPolicy schedule="0 0 0,12 * * ?" />
</RollingFile>
I used date in filePattern, but the date log4j create is not right.
Today is 2015-11-23, but log4j create a file directory named 2015-12.
my log4j2 version is 2.4.1.
here is a snapshot
below is my log4j2 configuration.
<RollingFile name="RollingFile" fileName="logs/executor.log" append="true"
filePattern="logs/$${date:yyyy-MM}/executor-%d{yyyy--MM--dd}-%i.log.gz">
<PatternLayout>
<Pattern>%t %d{yyyy-MM-dd HH:mm:ss} %c %p -%m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="24" modulate="true"/>
<SizeBasedTriggeringPolicy size="1MB"/>
</Policies>
</RollingFile>
This issue is due to your intervals. Its effectively setting up the initial rollover file to be when the end of the next rollover would be. The documentation on the RollingFileAppender for the TimeBasedTriggeringPolicy says: "How often a rollover should occur based on the most specific time unit in the date pattern." Since your most specific time unit is dd, or day of month, its setting it up for 24 days from 2015-11-23, or sometime in month 12, when it would rollover.
What you probably want is an interval of 1. This should rollover each file day and then once a month spills over, it would into the next subfolder because 1 day was triggered.
I've tested this with your pattern, but use a MM at the end and and a interval="24." Modulated, it rolled into 12/2016, but not modulated, it rolled over saying 11/2017! I can't say why and per my comment above, there have been issues with this feature reported.
Have same problem.
<RollingFile name="DailyFileAppender" fileName="logs/server.log"
filePattern="logs/server - %d{yyyy-MM-dd} - %i.log">
<PatternLayout>
<pattern>%d{yyyy-MM-dd HH:mm:ss,SSS}- %c{1}: %m%n</pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="5"/>
<SizeBasedTriggeringPolicy size="10 KB"/>
</Policies>
<DefaultRolloverStrategy max="4"/>
</RollingFile>
The output file's data is wrong. example the date is "2015-12-01" the output date is "2015-12-05"
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.