解决使用Java logging文件记录日志过程中产生.lck文件和重复文件的问题

问题描述

    在使用Java logging的过程中,产生了许多.lck文件和带着后缀的重复文件。尝试使用记事本打开这两种文件,.lck文件为空,不同的重复文件中记录的是一条或者几条不同的log信息。而需求是要将这些所有的log信息记录到一个文件中。

解决使用Java logging文件记录日志过程中产生.lck文件和重复文件的问题_第1张图片

.lck文件的作用

    名副其实,lck是lock的缩写。这类文件其实之前我们也接触过,不过大都没有注意而已。比如说使用VMware虚拟机运行Linux系统过程中,虚拟机对应的文件夹就会产生一个.lck文件,当虚拟机关闭相应的文件也会自动删除。但是如果虚拟机异常关闭.lck文件保留的情况下,再运行这个虚拟机将会遇到类似虚拟机不存在的错误(曾经遇到过)。说到这里其实也能对它的作用做一些基本的判断了。.lck文件就是对文件的一种锁定方式,当文件处于被访问状态时,一部分处理机制就是生成.lck文件防止其他进程的读取。当对着个文件访问的进程正常结束时,该文件自动删除,保持可访问状态。

问题的处理方法

    将lck文件全部删除,发现lck文件生成在程序运行阶段,但是关闭了以后并没被删除,手动删除以后再次运行,发现需要写入的log写入到了正确的文件中而不是另外生成一个带后缀的重名文件。考虑到是使用FileHandler过程中未调用close()方法来结束进程,于是在代码末尾添加了close()方法,发现仍会出现相同的问题,但是生成的重名文件变少了几个。问题没有解决,但是方向和思路应该就在这里。

    然后我检查了我所有的代码,定义过FileHandler的地方已经全部调用过了close()方法,相同的问题仍然存在。网上查阅了,相关内容很少。最后在stackoverflow上找到了相关的问题,有如下的回答:

.lck is used by the handler(file handler) to lock the file in order to delete this file. You need to close the Handler that is associated with that logger object before you close your program.

Here is sample lines how you can close associated handler:
for(Handler h:log.getHandlers())
{
    h.close();   //must call h.close or a .LCK file will remain.
}

然后我意识到同时存在两个指向相同文件的FileHandler是不允许的。所以当一个方法中FileHandler没有关闭的情况下,如果调用其他的方法也调用了FileHandler指向相同的文件,所以对于main函数的方法调用先后也需要有个合适的顺序,两个指向相同文件的FileHandler是不允许同时存在的。

    对于这个问题其实也能反映出很多其他问题,对于文件的读写操作,一定要文件末尾或者finally中对定义的相关对象进行close()操作

你可能感兴趣的:(logging)