Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.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
JavaLogger随机写入第二个文件_Java_Logging_Jar - Fatal编程技术网

JavaLogger随机写入第二个文件

JavaLogger随机写入第二个文件,java,logging,jar,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.Forma

我有一个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,然后第4次运行到.0.1。那么接下来的10可能又是正确的。很难说。然而,它确实经常发生(我想说,它大约每1/8的时间就写入.0.1)

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

文件是否仍然可以从我上次运行时锁定

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

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

如果确实要将所有内容写入一个日志文件,则必须执行以下操作之一:

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

  • 很抱歉反应太晚。我不得不继续这个项目,直到现在才有时间重新考虑这个问题。不管怎样,你似乎是对的。我有多个jar实例同时运行。然后,当他们试图访问日志时,它被锁定,并写入.0、.1等。我考虑使用文件锁(java.nio.channels)。但是,我似乎无法让它与日志文件一起工作。我更新了答案,有什么想法吗。如果您需要并发JVM,那么代理处理程序就是最好的选择。如果需要,我可以提供一些示例代码。