2012-08-28 30 views
1

我有一個應用程序,它使用JDK Logging和一個logging.properties文件,該文件通過java.util.logging.FileHandler.count配置許多較早的日誌文件。如何使用JDK日誌記錄手動轉存日誌文件

在應用程序中的某些點,我想觸發手動翻轉日誌文件以啓動一個新的日誌文件,例如,在計劃的活動開始之前。

JDK Logging有可能嗎?

在Log4j中,我使用了以下內容,但是在這種情況下,我想使用JDK Logging!

Logger logger = Logger.getRootLogger(); 
Enumeration<Object> appenders = logger.getAllAppenders(); 
while(appenders.hasMoreElements()) { 
    Object obj = appenders.nextElement(); 
    if(obj instanceof RollingFileAppender) { 
     ((RollingFileAppender)obj).rollOver(); 
    } 
} 
+0

我建議使用SLF4J爲 「橋」 的java.util.logging在大多數的logback的log4j或。請參閱:http://www.slf4j.org/legacy.html#jul-to-slf4j。通過logback滾動,zpipping文件等只是一個配置問題。 –

+0

是的,當然,我也可以完全切換到Log4j,因爲它不是一個大的應用程序,但我有興趣,如果我可以使用JDK Logging本身。 另外我對配置的可能性不感興趣,而是在代碼中的特定點處進行翻轉。 – centic

回答

2

你將不得不編寫你自己的處理程序才能讓輪換工作。像JBoss Log Manager這樣的東西適用於JDK日誌記錄,只是取代了logmanger部分。它已經有幾個不同的rotating handlers

+0

:(我不想深入到日誌框架中,但似乎沒有其他方法... – centic

2

您可以通過創建一個帶有零限制並且沒有附加內容的FileHandler來觸發旋轉。

new FileHandler(pattern, 0, count, false).close();

  1. 刪除並關閉現有的FileHandler
  2. 創建和關閉旋轉的FileHandler。
  3. 使用默認設置創建並添加FileHandler。

否則,您可以訴諸使用反射:

 Method m = FileHandler.class.getDeclaredMethod("rotate"); 
     m.setAccessible(true); 
     if (!Level.OFF.equals(f.getLevel())) { //Assume not closed. 
      m.invoke(f); 
     } 
-1
RollingFileHandler fileHandler = new RollingFileHandler(path); 
fileHandler.setFormatter(newFormatter); 
fileHandler.setLevel(level); 
logger.addHandler(fileHandler); 



import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.Locale; 
import java.util.logging.ErrorManager; 
import java.util.logging.LogRecord; 
import java.util.logging.StreamHandler; 


public class RollingFileHandler extends StreamHandler { 

    private static String dateFormat = "yyyy-MM-dd"; //default 

    private String path = null; 

// Standard-Log-Puffer (vergrößert sich on Demand) 
    static ByteArrayOutputStream bas = new ByteArrayOutputStream(1024*200*25); 

    /** 
    * Constructor. 
    */ 
    public RollingFileHandler() { 
     super(); 
     setOutputStream(bas); 
     // Write old data in Multithread-Environment 
     flush(); 
    } 

    public RollingFileHandler(String path) { 
     this.path = path; 
    } 

    /** 
    * Overwrites super. 
    */ 
    public synchronized void publish(LogRecord record) { 
     if (!isLoggable(record)) { 
      return; 
     } 
     super.publish(record); 
    } 


    @Override 
    public synchronized void flush() { 

     // Puffer ist leer 
     if (bas.size() == 0) { 
      return; 
     } 

     super.flush(); 

     File file = null; 

     try { 

      String dateString = null; 

      SimpleDateFormat sdf = new SimpleDateFormat(dateFormat, Locale.getDefault()); 
      dateString = sdf.format(new Date()); 
      String fileName = "dummyFile_" + dateString + ".log"; 

      try { 

       // Auf den Servern mapping, bei lokalem Test am Arbeitsplatz brauche ich kein Logfile-Mapping 

       boolean windows = System.getProperty("os.name").toLowerCase().indexOf("win") >= 0 ; 

       if (!windows 
         && path != null) { 

        File unixLogDir = new File(path); 

        if (unixLogDir.exists()) { 

         // Versuchen in das neue Directory zu speichern 
         File logfile = new File (path + "/" + fileName); 
         if (!logfile.exists()) { 
          logfile.createNewFile(); 
         } 
         file = logfile; 
        } 
       } 

      } catch(Exception e) { 
       e.printStackTrace(); 
      } 


      if (file == null) { 

       // Fallback - Umzug hat nicht geklappt 
       file = new File(fileName); 
       if (!file.exists()) { 
        file.createNewFile(); 
       } 
      } 

      FileOutputStream fos = new FileOutputStream(file,true); 
       bas.flush();  
       bas.writeTo(fos); 
       bas.reset(); 
      fos.close(); 


    } catch (Exception fnfe) { 
     reportError(null, fnfe, ErrorManager.GENERIC_FAILURE); 
     fnfe.printStackTrace(System.err); 
     setOutputStream(System.out); //fallback stream 
     try { 
      bas.writeTo(System.out); 
     } catch (IOException e) { 
      // Da kann man nichts machen 
     } 

    } 

} 

}

相關問題