0

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

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

像这样:

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

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

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

4

1 回答 1

1

通过关闭 FileHandler,您可能会支付同步的费用。

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

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

于 2014-08-13T18:49:59.543 回答