2013-04-20 68 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"; 

这是我使用的代码。一旦我评论出日志格式不再重置,现在一切都按预期工作。