2017-01-10 34 views
0

我的Java應用程序CB從數據庫中獲取數據,例如「Case 1」。每次CB開始是創建一個日誌文件:保留2個先前版本的日誌文件

Logger logger = Logger.getLogger("CBLog"); 
fh = new FileHandler(CBDataPath + "\\CB.log"; 
logger.addHandler(fh); 
SimpleFormatter formatter = new SimpleFormatter(); 
fh.setFormatter(formatter); 
logger.info("CB started"); 

我想保持以前的2個日誌文件的版本爲特定的情況下。這怎麼能夠輕鬆完成?

這裏有一個想法,我有。我可以維護一個代表Case數據庫中運行號的整數。每個連續的運行命名日誌文件CB_CaseA_n.log,其中n是前一個運行號加1.每次在CaseA上運行CB時,將在CasaA目錄中搜索所有CB_CaseA _ ?.日誌文件,並且只保留最近3個文件。即,CB_CaseA_7的第10次運行將被刪除。看起來不很優雅。

有沒有更好的方法?

回答

1

java.util.logging.FileHandler

計數至(默認爲1)指定輸出多少文件循環。

「%G」 的世代號來區分循環日誌

與計數和生成模式創建的FileHandler:

new FileHandler("CBDataPath + "\\CB%g.log, Integer.MAX_VALUE, 2, false); 
+0

謝謝!惡搞,我剛剛完成我自己的黑客!我會嘗試你的建議。 –

+0

對於代碼格式化,或者更確切地說,缺少它。我間隔4,然後粘貼...猜猜它沒有工作。 –

+0

糟糕。似乎是一個問題。除了創建CB0.log之外,它還創建CB0.log.lck。後者在程序完成時被刪除。我理解它意味着日誌文件已經存在於另一個進程中。我剛剛使用了你的新FileHandler行(用稍微更正的方式代替了我的地址) –

0

這裏是我的解決方案。解釋:

updateLogHistory() maintains historical log files in the MyConcourses directory. It is called in the ConcoursGUI() constructor. 

The intuition is a "stack" of log files with the current log, i.e., ConcoursBuilderLog_0.log, on top. To make room for a new log file 
for the ConcoursBuilder session, any existing log files have to be "pushed down." However, the stack is allowed to hold only a prescribed 
number, size, elements so if there are already size files in the stack the bottom one gets deleted, or rather, overwritten. When the function 
finishes the top TWO will be identical, so the top one can be overwritten in the caller. 

It's important to note that "stack" is a metaphor here; there isn't a stack in the sense of a programed data structure. There can be only 
size log files in the MyConcourses folder. What actually happens in a so-called push is the CONTENTS of ConcoursBuilderLog_i.log 

被複制到ConcoursBuilderLog_i + 1.log中,而不改變ConcoursBuilderLog_i.log。

// The algorithm below requires an initial ConcoursBuilder_0.log. Consequently, prior to calling updateLogHistory() 
// the directory is first checked and an empty one is created if absent. Typically, this happens only in the first 
// run after INSTALLATION of ConcoursBuilder. However, it must be checked because the user might accidently deleted it. 
// 
// Work from the bottom up to push all existing log files down, leaving the contents of the current ConcoursBuilderLog_0 in 
// both ConcoursBuilderLog_0 and 1. the subsequent log file will overwrite both ConcoursBuilderLog_0. 
// 



Logger logger = Logger.getLogger("ConcoursBuilderLog"); 
File logFile = null; 
try { 
    String strFileFullPath = concoursBuilderDataPath + "\\ConcoursBuilderLog_" + 0 + ".log"; 
    logFile = new File(strFileFullPath); 
    if(!logFile.exists()){ 
     try { 
      logFile.createNewFile(); 
     } catch (IOException ex) { 
      Logger.getLogger(ConcoursGUI.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     try {    
      Files.write(Paths.get(logFile.getPath()), "Empty log file".getBytes(), StandardOpenOption.WRITE); 
     } catch (IOException ex) { 
      Logger.getLogger(ConcoursGUI.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
    // Maintain a "stack" of historical ConcoursBuilder log files. 
    updateLogHistory(NUM_SAVED_LOGS, logFile); 

} catch (SecurityException e) { 
    e.printStackTrace(); 
} 
fhLogger = null; 
try { 
    fhLogger = new FileHandler(logFile.toString(), false); 
} catch (IOException ex) { 
    Logger.getLogger(ConcoursGUI.class.getName()).log(Level.SEVERE, null, ex); 
} catch (SecurityException ex) { 
    Logger.getLogger(ConcoursGUI.class.getName()).log(Level.SEVERE, null, ex); 
} 
logger.addHandler(fhLogger); 
logger.setLevel(Level.ALL); 
SimpleFormatter formatter = new SimpleFormatter(); 
fhLogger.setFormatter(formatter); 

// the updater 
private static void updateLogHistory(int size, File logFile0){ 
     String strTemp = logFile0.toString(); 
    String strPrefix = strTemp.substring(0, strTemp.indexOf("_")+1); 
    for(int i = size-1; i >=0; i--){ 
     String strFileFullPath = strPrefix + i + ".log"; 
     File logFile_i = new File(strFileFullPath); 
     if(logFile_i.exists() && !logFile_i.isDirectory()){ 
      Path path= Paths.get(strFileFullPath); // this is the the absolute path to the i file as a Path     
      if(i != size-1){ 
       // not at the end so there is a valid file name i+1. 
       // Note that the file selected by iNext has already been pushed into iNext+1, or is the last. Either way, 
       // it can properly be overwritten. 
       int iPlus1 = i + 1; 
       String strFileFullPathIPlus1 = strPrefix + iPlus1 + ".log"; 
       Path pathIPlus1 = Paths.get(strFileFullPathIPlus1); // absolute path to the file as a Path     
       try { 
        Files.copy(path, pathIPlus1, REPLACE_EXISTING); 
       } catch (IOException ex) { 
        okDialog("IOException while updating log history in updateLogHistory()"); 
        Logger.getLogger(ConcoursGUI.class.getName()).log(Level.SEVERE, null, ex); 
       } 
       continue; // (unnecessary) branch back to for() 
      } else{ 
       // Getting here means stack is full. IOW, the reference file the is last log file to be kept so we no longer need it's contents. 
       // No action required since it will simply be overwritten in the next pass. 
       // things in the next pass.; 
      } 
     } 
    } 

}