【问题标题】:Performance hit opening and closing filehandler?性能影响打开和关闭文件处理程序?
【发布时间】:2014-08-14 03:32:08
【问题描述】:

我有一个持久的事件驱动的 HTTP 上传程序(热文件夹),它会在每个操作上写入日志。它会无限期地运行,直到用户决定关闭它。

为了确保在应用程序关闭时关闭日志,我编写了这样的程序,每次写入日志时,它都会打开日志文件,写入,然后关闭日志。

像这样:

fh = new FileHandler(logName, true);
fh.setFormatter(new MyCustomFormatter());
logger.addHandler(fh);
logger.info(message);
logger.removeHandler(fh);
fh.close();

最近,我考虑通过在上传作业期间打开日志(可能有数百次写入日志)然后在作业完成时关闭来减少打开/关闭次数。

长话短说,我期望从中获得多少性能提升?是否有其他选项可以确保应用程序在没有未关闭的日志文件的情况下关闭?

【问题讨论】:

  • 似乎应该很容易测试这个......
  • 假设您正在使用 java.util.log 工具,jdk 已经内置支持在 jvm 关闭时关闭它们。
  • 这个内置支持是什么?如果我关闭应用程序,文件应该自动关闭吗?那不是我的经验。当我关闭程序时,我不得不调用 fh.close() 以确保 .lck 文件消失。你是对的,我可以测试它。只是想对此发表意见。谢谢@jtahlborn
  • 没关系,我明白你在说什么。关机挂钩。我有这种方式,但它只在预期的关闭时运行。如果用户强制关闭程序怎么办? @jtahlborn
  • 如果用户强制关闭程序,那么您将丢失任何缓冲输出(操作系统仍会为您关闭文件)。与大多数编程一样,您必须平衡性能需求和可靠性需求。

标签: java java.util.logging filehandler


【解决方案1】:

通过关闭 FileHandler,您可能需要支付sync 的费用。

如果您在 JVM 关闭时将 FileHandler 附加到记录器,则 LogManager 将关闭日志文件。如果您从记录器中删除处理程序,您有责任关闭它。如果您的记录器在关闭之前是garbage collected,则 FileHandler 不会关闭。这种类型的“文件垃圾”可以通过更改代码来纠正。

如果您的 JVM 崩溃或存在与关闭 log/lck 文件相关的 I/O 异常,那么您将看到剩余的 lck 文件和可能不包含格式化程序尾字符串的日志文件。这种情况很少见,但没有办法阻止它。您必须应用检测和纠正策略来消除这些情况。

【讨论】:

    猜你喜欢
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    相关资源
    最近更新 更多