Recently came across a problem whereby the quartz scheduler could not recreate a new log4j FileAppender log when the job is call again.
Googled a bit and found out a couple of solutions such as using a custom log4j classes, which create a seperate thread when being called in quartz scheduler.
I find that it is too complex and had try several ways to recreate the log file inside Quartz.
And finally came up with this one line of code.
Before I begin, let’s take a look at my log4j config.
This log4j config will create a simple console system out logger and also a FileAppender logger.
For my case, I want to re-create a new log file whenever this job is run.
log4j.rootLogger=INFO, stdout log4j.additivity.stdout=false log4j.additivity.joblog=false log4j.appender.ROOT.layout.ConversionPattern=[%d] %t %c %-5p - %m%n #console log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p - %m%n #per job execution log log4j.logger.com.yourcompany=INFO, joblog log4j.appender.joblog=org.apache.log4j.FileAppender log4j.appender.joblog.layout=org.apache.log4j.PatternLayout log4j.appender.joblog.File=../jobtemp.log log4j.appender.joblog.Append=false log4j.appender.joblog.layout.ConversionPattern=%d %p - %m%n
and here’s the schedule job
public class ScheduleJob implements StatefulJob { private static Logger logger = Logger.getLogger(ScheduleJob.class); public void startJob() throws SchedulerException{ Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); scheduler.start(); } public void execute(JobExecutionContext context) throws JobExecutionException { //reset log4j config for FileAppender PropertyConfigurator.configure("../conf/log4j.properties"); RunJobImmediately newJob = new RunJobImmediately(); newJob.performJob(); } public static void main(String args[]){ try{ ScheduleJob scheduleJob = new ScheduleJob(); scheduleJob.startJob(); }catch(Exception e){ logger.error(e); } } }
and finally the one line of code to recreate the log file.
Apparently, this line will somehow ‘reload’ the log4j utitlies, which thus recreate the FileAppender logger to re-create the log file.
PropertyConfigurator.configure("../conf/log4j.properties");
Feel free to let me know if there is any performance issues or it is not working at your side.