0

我像这样初始化记录器:

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
   }
}

现在正常的 Log 输出如下所示:

2013-04-20 18:00:59 +0200 信息:启动跟踪器

它工作了一段时间,但无论出于何种原因,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 包。日志日志警告:

内存使用量: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 的日志功能可能有什么问题或为什么日志突然重置?

4

1 回答 1

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";

这是我使用的代码。一旦我将其注释掉,日志格式就不再重置,现在一切都按预期工作。

于 2013-05-09T00:50:44.923 回答