2015-06-22 12 views
5

Ich benutze java.util.logging Framework, um die Protokollierung in meiner JSF-Anwendung zu implementieren. Ich habe das erfolgreich implementiert, aber ich habe eine neue Anforderung, die Protokolle zu rotieren und eine neue Protokolldatei für jeden Tag zu erstellen.Java.util.logger neue Datei jeden Tag

Ich bin nicht in der Lage herauszufinden, wie dies implementiert werden kann. Hinweise zur Implementierung werden sehr geschätzt. Vielen Dank.

Dies ist, wie ich meine Logger konfiguriert haben:

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

Antwort

4

Da Sie Code für die Einrichtung Ihres Filehandler, dann können Sie add code to close and recreate the FileHandler mit dem '% g' verwenden.

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

Wenn Sie wollen, dass es Ihnen einfach eine proxy handler für den Filehandler erstellen kann automatisch arbeiten Schließen und neu zu erstellen Dateien jeden Tag zu behandeln.

0

Erstellen Sie eine Aufgabe, die jeden Tag um Mitternacht ausgeführt wird mit ScheduledThreadPoolExecutor und in der Aufgabe dispose und schließen Sie den aktuellen FileHandler und erstellen Sie dann einen neuen mit dem aktualisierten Dateinamen.

So etwas sollte funktionieren:

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

} 
Verwandte Themen