gpt4 book ai didi

JavaLogger 随机写入第二个文件

转载 作者:行者123 更新时间:2023-12-01 13:38:33 25 4
gpt4 key购买 nike

我有一个 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 运行过程中,这种情况从未发生过。 jar 运行的整个过程中它都会记录到 .0.1。该文件是否仍因我之前的运行而被锁定?

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

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

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

正如我所说,这只是随机发生的。 jar 的前 3 次运行可能是 .0,然后第四次是 .0.1。那么接下来的 10 个可能又是正确的。很难说。然而它确实经常发生(我想说它大约每 1/8 的时间写入 .0.1)。

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

最佳答案

Could the file still be locked from my previous run?

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

FileHandler 会尽一切努力防止两个同时运行的 JVM 写入同一个日志文件。如果允许这种行为,日志文件将几乎无法阅读和理解。

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

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

关于JavaLogger 随机写入第二个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21045936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com