2014-01-10 59 views
0

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

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退出之前关闭处理程序。只有一个从罐出口点,我把下面的代码之前正确的:

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

我已经通过调试运行这个并没有永远只一个处理程序(我加的FileHandler)。

正如我所说的,这只是随机发生的。罐子的前3次运行可以是.0,然后是第四次运行到.0.1。然后下一个10可能再次正确。这很难说。然而它确实发生得相当频繁(我会说它大约每1/8次写入.0.1)。

任何想法/建议将是伟大的。提前致谢。

回答

0

该文件仍然可以锁定从我以前的运行?

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

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

如果你真正想写的一切,一个日志文件,那么你必须执行下列操作之一:

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

对不起,迟到的回应。我不得不继续这个项目,直到现在没有时间重新讨论这个问题。无论如何,你对此似乎是正确的。 我有一次运行的jar的多个实例。然后,当他们尝试访问日志时,它将被锁定并写入.0,.1等。 我考虑过使用文件锁(java.nio.channels)。不过,我似乎无法让它与日志文件一起工作。关于我应该从哪里出发的任何想法? –

+0

我更新了答案。如果你需要并发的JVM,那么代理处理程序就是要走的路。如果您需要,我可以包含一些示例代码。 – jmehrens