我像这样初始化记录器:
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();
}
要使用Log,请使用以下方法:
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-04-20 18:00:59 +0200 INFO:启动追踪器
它工作了一段时间,但LogFormatter似乎因任何原因而被重置。
有时只能正确显示一个日志条目,之后日志条目显示如下:
2013年4月20日下午6:01:01 package.util.Log日志信息:
已加载33266个数据库条目。
试。
我尝试了什么:
出于调试目的,我添加了一个线程,每x秒输出一次jvm的内存使用情况。 输出使用正确的日志格式,直到保留的内存值发生更改(可用内存值更改未重置日志格式),如下所示:
2013-04-20 18:16:24 +0200警告:内存使用量:23/74/227 MiB
2013-04-20 18:16:25 +0200警告:内存使用量:20/74/227 MiB
2013-04-20 18:16:26 +0200警告:内存使用情况:18/74/227 MiB
2013年4月20日下午6:16:27 package.util.Log日志警告:
内存使用量:69/96/227 MiB
2013年4月20日下午6:16:27 package.util.Log日志信息:
计划程序正在运行
2013年4月20日下午6:16:27 package.Log日志警告:
内存使用量:67/96/227 MiB
另请注意,此处的日志级别似乎已从警告重置为信息。
问题出在哪里:
当我注释掉数据库日志功能时:
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 :(得分: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";
这是我使用的代码。一旦我评论它,日志格式就不再重置,现在一切都按预期工作。