关闭日志文件

Posted

技术标签:

【中文标题】关闭日志文件【英文标题】:Close log files 【发布时间】:2012-10-02 16:23:32 【问题描述】:

这个项目是传给我的,所以我不太了解。有一种方法使用日志(java.util.logging.Logger),它会创建两个日志文件:

第一个文件:fileName.log

第二个文件:fileName.log.lck

在 Linux 中,当我执行 lsof 时,我看到这两个文件是打开的。如何关闭这两个文件?

我想关闭这些文件的原因是这种方法每天运行多次,几周后打开文件的数量达到限制(大约 1000 个),此时我们的系统停止工作。当我们重新启动我们的进程(执行日志记录的“作业控制器”)时,打开的日志文件数变为 0,并且它再次工作。

这就是日志记录所做的工作

private static Logger log = Logger.getLogger(MyClass.class.getPackage().getName());
try
    log.logp(Level.SEVERE, "com.MyClass", "run", "It failed");

这是我试图关闭 finally 块中的文件但它不起作用

finally
    Handler[] handler =   log.getHandlers();
    for(Handler h: handler)
        h.close();
    

【问题讨论】:

为什么要关闭这些文件? 关闭这些文件可能会给你带来麻烦.. 文件名是什么?每天都有一个吗?我不知道为什么应用程序会为典型的日志记录一次保持如此多的打开状态。查看 Java 规范和 OpenJDK 源代码,close() 应该可以工作,但如果您之后尝试再次记录某些内容,则会引发错误。 听起来关闭两个文件不会解决达到打开文件限制的问题。或者正如史蒂夫所说,这两个文件是否会被打开,并且每天都保持打开状态? 我认为这不是您的问题所在。在大多数应用程序中,您在任何时候都只会打开几个日志文件。当您不关闭文件(甚至不释放它们的引用,因为即使您不记得调用close() 文件最终应该被清理)时,我会在您的应用程序中寻找其他情况。如果您确实需要打开一堆文件,可以increase the limit。 【参考方案1】:

我只是使用:

LogManager.getLogManager().reset();

这将取消您的所有日志设置(日志文件路径、文件名模式、格式化程序...),但它将停止使用记录器关闭锁定文件并释放记录器到

【讨论】:

方法很简单!谢谢!【参考方案2】:

第一个解决方案

如果您不想修改代码,请使用:How to send java.util.logging to log4j? java.util.logging.Logger to Logback using SLF4J?

我使用log4j 或logback。两者都有滚动文件附加器(旧文件被删除)或日期/时间文件附加器。

第二种解决方案

对于记录,最好的用法是滚动文件。

String filePattern = " fileName%.log";
int limit = 1000 * 1000; // 1 Mb
int numLogFiles = 3;
FileHandler fh = new FileHandler(filePattern, limit, numLogFiles);

// Add to logger
Logger logger = Logger.getLogger(MyClass.class.getPackage().getName());
logger.addHandler(fh);

我不知道你是否可以添加全局文件处理程序。

【讨论】:

以上是关于关闭日志文件的主要内容,如果未能解决你的问题,请参考以下文章

任何获取目录名而不是日志文件名的日志查看器[关闭]

在 Linux 中为防火墙日志配置特定的日志文件 [关闭]

日志文件的自动对话[关闭]

如何打开或关闭信息中心的调试/日志/告警等显示信息

在 Linux 中动态查看日志文件 [关闭]

ZENCART 打开/关闭日志文件