2015-06-22 15 views
5

Korzystam z ramy java.util.logging do implementacji logowania w mojej aplikacji JSF. Z powodzeniem udało mi się to wdrożyć, ale jednak mam nowy wymóg, aby obracać dzienniki i tworzyć nowy plik dziennika dla każdego dnia.Java.util.logger nowy plik codziennie

Nie jestem w stanie dowiedzieć się, w jaki sposób można to zrealizować. Wszelkie sugestie dotyczące implementacji będą wysoko cenione. Dzięki.

To jak mam skonfigurowany mój Rejestrator:

 myLogger = Logger.getLogger("info.aio"); 
     fileHandler = new FileHandler("aioinfo.log", 1048576, 100, true); 
     fileHandler.setFormatter(new SimpleFormatter()); 
     myLogger.addHandler(fileHandler); 

Odpowiedz

4

Ponieważ używasz kodu sposób skonfigurować FileHandler Następnie można add code to close and recreate the FileHandler użyciem '% g'.

public static void main(String[] args) throws Exception { 
    //create aioinfo0.log. 
    install(); 
    //rename aioinfo0.log to aioinfo1.log and create aioinfo0.log. 
    install(); 
} 

private static final Logger myLogger = Logger.getLogger("info.aio"); 
private static volatile FileHandler fileHandler; 

private static void install() throws IOException { 
    FileHandler fh = fileHandler; 
    if (fh != null) { 
     myLogger.removeHandler(fh); 
     fh.close(); //Release any file lock. 
    } 

    fileHandler = rotate("aioinfo%g.log", 1048576, 100, true); 
    fileHandler.setFormatter(new SimpleFormatter()); 
    myLogger.addHandler(fileHandler); 
} 

private static FileHandler rotate(String pattern, int limit, int count, boolean append) throws IOException { 
    if (pattern == null) { 
     LogManager m = LogManager.getLogManager(); 
     String p = FileHandler.class.getName(); 
     pattern = m.getProperty(p + ".pattern"); 
     if (pattern == null) { 
      pattern = "%h/java%u.log"; 
     } 
    } 

    new FileHandler(pattern, 0, count, false).close(); //Trigger rotate. 
    return new FileHandler(pattern, limit, count, append); 
} 

Jeśli chcesz go automatycznie pracować można po prostu stworzyć proxy handler dla FileHandler obsłużyć zamknięcia i odtworzenie plików każdego dnia.

0

Utwórz zadanie, które będzie uruchamiane codziennie o północy za pomocą programu ScheduledThreadPoolExecutor, a następnie usuń bieżący obiekt FileHandler, a następnie utwórz nowe, używając zaktualizowanej nazwy pliku.

Coś jak to powinno działać:

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()); 
    } 
} 

} 
Powiązane problemy