2013-04-20 69 views
0

我初始化記錄是這樣的:Java的日誌格式是復位

public static void init() { 
    ConsoleHandler handler = new ConsoleHandler(); 
    handler.setFormatter(new LogFormatter()); 
    Logger.getLogger(TrackerConfig.LOGGER_NAME).setUseParentHandlers(false); 
    Logger.getLogger(TrackerConfig.LOGGER_NAME).addHandler(handler); 
} 

的LogFormatter的格式功能:

@Override 
public String format(LogRecord record) { 
    StringBuilder sb = new StringBuilder(); 

    sb.append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z").format(new Date(record.getMillis()))) 
    .append(" ") 
    .append(record.getLevel().getLocalizedName()).append(": ") 
    .append(formatMessage(record)).append(LINE_SEPARATOR); 

    return sb.toString(); 
} 

使用的日誌我用下面的方法:

private static void log(Level level, String message) { 
    Logger.getLogger(TrackerConfig.LOGGER_NAME).log(level, message); 
    if (level.intValue() >= TrackerConfig.DB_LOGGER_LEVEL.intValue()) { 
     DBLog.getInstance().log(level, message); 
    } 
} 

DBLog.log方法:

public void log(Level level, String message) { 
    try { 
     this.logBatch.setTimestamp(1, new Timestamp(Calendar.getInstance().getTime().getTime())); 
     this.logBatch.setString(2, level.getName()); 
     this.logBatch.setString(3, message); 
     this.logBatch.addBatch(); 
    } catch (SQLException ex) { 
     Log.logError("SQL error: " + ex.getMessage()); // if this happens the code will exit anyways so it will not cause a loop 
    } 
} 

現在正常的日誌輸出看起來像這樣:

2013年4月20日18時00分59秒+0200信息:啓動跟蹤

它工作了一段時間,但LogFormatter似乎因爲任何原因被重置。

有時只有一個日誌條目正確顯示,之後顯示類似的日誌條目:

2013年4月20日下午6時01分01秒package.util.Log登錄INFO:

加載了33266個數據庫條目。

再次。

我試了一下:

對於調試目的,我補充說,每輸出x秒JVM的內存使用一個線程。 輸出與正確的日誌格式,直到更改了保留的內存值的工作(空閒內存值的變化並沒有清除日誌格式)是這樣的:

二零一三年四月二十零日十八時16分24秒+0200警告:內存使用:23 /二百二十七分之七十四MIB

2013年4月20日18點16分25秒0200警告:內存使用:20支/二百二十七分之七十四MIB

2013年4月20日18:16: 26 +0200警告:內存使用情況:18/74/227 MiB

2013年4月20日6:16:27 package.util.Log log警告:

內存使用69/96/227 MIB

2013年4月20日下午6時16分27秒package.util.Log登錄INFO:

調度運行

2013年4月20日6 :16:27 PM package.Log日誌警告:

內存使用67/96/227 MIB

還要注意的是,日誌級別似乎到b在此處將警告重置爲信息。

那裏的問題似乎是:

當我註釋掉這樣的數據庫日誌功能:

private static void log(Level level, String message) { 
    Logger.getLogger(TrackerConfig.LOGGER_NAME).log(level, message); 
    if (level.intValue() >= TrackerConfig.DB_LOGGER_LEVEL.intValue()) { 
     // DBLog.getInstance().log(level, message); 
    } 
} 

的日誌格式正確。

任何想法什麼可能是錯誤的DBLog的日誌功能或爲什麼日誌突然重置?

回答

0

我真的不會稱這是一個解決方案,但它現在起作用。 原因似乎是內存計算本身。 即使我只是在沒有記錄它的情況下計算它,日誌格式被重置。 我不知道爲什麼它在我剛剛註釋掉DBLog用法時起作用。

int mb = 1024 * 1024; 
long freeMemory = Runtime.getRuntime().freeMemory()/mb; 
long reservedMemory = Runtime.getRuntime().totalMemory()/mb; 
long maxMemory = Runtime.getRuntime().maxMemory()/mb; 
String memoryUsage = "Memory usage: " + freeMemory + "/" + reservedMemory + "/" + maxMemory + " MiB"; 

這是我使用的代碼。一旦我評論出日誌格式不再重置,現在一切都按預期工作。