Create a task that runs every day at midnight using the ScheduledThreadPoolExecutor, and in the task, delete and close the current FileHandler, and then create a new one with the updated file name.
Something like this should work:
public class DailyLogger { private static Logger logger; private static FileHandler fh; public static Logger getLogger() { if(logger == null){ initLogger(); ScheduledThreadPoolExecutor sch = (ScheduledThreadPoolExecutor)Executors.newScheduledThreadPool(1); // Create a task for one-shot execution using schedule() Runnable renameLoggerFile = new Runnable(){ // int countRuns = 0; // For testing only @Override public void run() { fh.flush(); fh.close(); try { fh = createFilehandler(new java.sql.Date(System.currentTimeMillis()).toString()); // fh = createFilehandler(new java.sql.Date(System.currentTimeMillis()).toString()+"_"+countRuns++); // for testing SimpleFormatter formatter = new SimpleFormatter(); fh.setFormatter(formatter); logger.addHandler(fh); logger.warning("Runnable executed, new FileHandler is in use!"); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; Calendar c = Calendar.getInstance(); long now = c.getTimeInMillis(); c.set(Calendar.HOUR_OF_DAY, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); c.set(Calendar.MILLISECOND, 0); long passed = now - c.getTimeInMillis(); long secondsPassedToday = passed / 1000; long secondsInDay = 86400; TimeUnit timeUnit = TimeUnit.SECONDS; // sch.scheduleAtFixedRate(renameLoggerFile, 5, 10, timeUnit); // for testing long initialDelay = secondsInDay - secondsPassedToday; long relaunchPeriod = secondsInDay; sch.scheduleAtFixedRate(renameLoggerFile, initialDelay, relaunchPeriod, timeUnit); } return logger; } private static FileHandler createFilehandler(String dateForName) throws SecurityException, IOException{ String folder = "log"; File fileFolder = new File(folder); // Create folder log if it doesn't exist if(!fileFolder.exists()){ fileFolder.mkdirs(); } dateForName = folder + File.separator + dateForName + ".log"; boolean appendToFile = true; return new FileHandler(dateForName, appendToFile); } private static void initLogger(){ String folder = "log"; File fileFolder = new File(folder); // Create folder "log" if it doesn't exist if(!fileFolder.exists()){ fileFolder.mkdirs(); } logger = Logger.getLogger("DailyLogger"); try { // This block configure the logger with handler and formatter boolean appendToFile = true; fh = new FileHandler(folder + File.separator + new java.sql.Date(System.currentTimeMillis()) + ".log", appendToFile); logger.addHandler(fh); SimpleFormatter formatter = new SimpleFormatter(); fh.setFormatter(formatter); // the following statement is used to log any messages logger.info("DailyLogger initialized..."); } catch (SecurityException e) { logger.warning("Problem at initializing logger... " + e.getMessage()); } catch (IOException e) { logger.warning("Problem at initializing logger... " + e.getMessage()); } } }
source share