Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java日志格式化程序已重置_Java_Mysql_Logging - Fatal编程技术网

Java日志格式化程序已重置

Java日志格式化程序已重置,java,mysql,logging,Java,Mysql,Logging,我按如下方式初始化记录器: public static void init() { ConsoleHandler handler = new ConsoleHandler(); handler.setFormatter(new LogFormatter()); Logger.getLogger(TrackerConfig.LOGGER_NAME).setUseParentHandlers(false); Logger.getLogger(TrackerConfig.LOG

我按如下方式初始化记录器:

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);
}
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);
   }
}
日志格式化程序的格式化功能:

@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-04-20 18:00:59+0200信息:启动跟踪器

它工作了一段时间,但不管出于什么原因,日志格式化程序似乎被重置了

有时仅正确显示一个日志条目,之后日志条目显示如下:

2013年4月20日下午6:01:01 package.util.Log日志信息:

加载了33266个数据库条目

再说一遍

我尝试的是:

出于调试目的,我添加了一个线程,该线程每x秒输出jvm的内存使用情况。 输出使用正确的日志格式,直到保留内存值更改(空闲内存值更改不会重置日志格式),如下所示:

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

还要注意,日志级别似乎从警告重置为信息

问题似乎在于:

当我注释掉数据库日志函数时,如下所示:

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);
}
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函数有什么问题,或者为什么日志会突然重置吗?

我不认为这是一个解决方案,但它现在可以工作了。 原因似乎是内存计算本身。 即使我只是计算而没有记录,日志格式也被重置了。 当我刚刚注释掉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";
这是我使用的代码。我一把它注释掉,日志格式就不再重置了,现在一切都正常了