JavaLogger随机写入第二个文件

时间:2014-01-10 13:44:39

标签: java logging jar

我有一个从另一个脚本每分钟调用一个jar。在这个jar中我创建了一个JavaLogger,它记录Jar运行时发生的事情。 JavaLogger写入的日志文件称为myLog.0。我有以下代码允许它转到.1 / .2 / .3 / .4。

try {
  FileHandler fileHandler = new FileHandler(filePath, 5242880, 5, true);
  fileHandler.setFormatter(new java.util.logging.Formatter() {
    @Override
    public String format(LogRecord logRecord) {
      return "[" + logRecord.getLevel() + " " + createDateTimeLog() + "]  " + logRecord.getMessage() + "\r\n";
    }
  });
  logger.addHandler(fileHandler);
} catch (IOException e) {}

所以我希望日志能够增长。但是,每隔一段时间,日志就会打印到myLog.0.1。我猜这是因为文件被锁定了。然而,这绝不会发生在我的罐子中期。它会在jar运行的整个时间内记录到.0.1。文件是否仍然可以锁定我之前的运行?

如果是这样,我甚至试图在Jar退出之前关闭处理程序。 jar中只有一个退出点,我将以下代码放在它之前:

MyLogger.logger.getHandlers()[0].close();

我通过调试器运行它,并且只有一个处理程序(我添加的FileHandler)。

正如我所说,这只是随机发生的。 jar的前3次运行可以是.0然后第四次运行到.0.1。然后下一个10可能再次正确。很难说。然而,它确实经常发生(我会说它每1/8时间写入.0.1)。

任何想法/建议都会很棒。提前谢谢。

1 个答案:

答案 0 :(得分:0)

  

文件是否仍然可以锁定我之前的运行?

可能是两个JVM同时运行你的jar。添加代码以获取RuntimeMXBean,然后添加单个日志语句以记录runtime namestart time。运行时名称通常映射到进程ID和主机名。

FileHandler尽其所能阻止两个并发运行的JVM写入同一个日志文件。如果允许这种行为,则几乎不可能阅读和理解日志文件。

如果您真的想将所有内容写入一个日志文件,则必须执行以下操作之一:

  1. 通过更改启动方式阻止并发JVM进程启动。
  2. 让代码检测另一个JVM是否正在运行您的代码并在创建FileHandler之前退出。
  3. 让每个JVM写入不同的日志文件并创建代码以安全地将文件合并为一个。
  4. 创建一个代理处理程序,为每个日志记录创建和关闭FileHandler。代理处理程序将使用预定义的文件名(与日志文件不同)和FileLock来序列化对来自不同JVM的日志文件的访问。
  5. 使用专用进程写入日志文件,让所有JVM向该进程发送日志消息。