关于Java日志log.lck文件的出现原因和关闭方法

出现的问题

实验中要求用log记录所有出现的异常情况和主程序的各个操作,但我们主程序里的各个操作是调用的是各个类的方法,如果全部在各个类里只抛出异常在主程序里处理,那主程序就会很冗余,而且也不符合ADT“自己的事自己干”的思想,一般我们向上抛出的异常是这个类处理不了的,所以我的想法是在各个类中就用try catch语句处理当下出现的异常,那就需要在各个类中就用log记录,一开始我是在在每个类都写上这么一段代码

Logger log = Logger.getLogger("log");
Calendar current = Calendar.getInstance();
FileHandler filehandler = new FileHandler("src/Logging/logging");
current.setFirstDayOfWeek(Calendar.MONDAY);
log.setLevel(Level.INFO);//设置级别
log.addHandler(filehandler);
//将异常信息输出到logging文件中显示出来

```java
current = Calendar.getInstance();
log.warning("发生时间:" + current.getTime().toString() + " 异常类型:NotdependencyrelationException" +
        " 类名:FileLoader" + " 方法名:readFlightInfo" + " 具体异常信息:" + e.toString1() + " 处理结果:忽略该条命令行所在的航班计划项");
        //在catch语句中写log

我原本以为我在哪几个类中写了这样的语句,程序运行时就会出现几个logging文件,我可以分别在logging文件中查看各种异常情况,但是运行时出现了问题:
并不是我运行一次主程序就只出现一个相应类中的logging文件,而是每一次我调用类,就会生成一个logging文件,只是后缀名改变,logging.1;logging.2;logging.3…而且伴随出现的还有logging.lck这个迷惑玩意儿。
可想而知,实验中输入是一个文件,文件里有十几万个对象需要调用不同类的方法,每一次调用出现两个logging文件,一瞬间直接给我弄死机。然后我就先考虑 .lck是个什么鬼。

logging.lck

见名思意,.lck表示的就是lock锁的含义,意思是一旦生成logging文件就锁住它,只有该进程结束了才释放它,这个锁其他进程不能获取,也就不能写进去东西。什么是进程结束就是主程序结束。所以在主程序没有结束前,我每调用一次类中方法就生成一个logging文件并且锁住它,下一次再生成一个新的文件和.lck文件。这就是问题的原理,好,这样肯定不对,下面说出我解决问题的思路和走的山路十八弯。

解决问题

一开始我就想那就不要锁住,每次调用都写进一个logging文件中,那就不会出现文件爆炸的情况,事实上通过查阅资料确实是有这样的方法的。在记录日志后写代码如下:

       for(Handler h:log.getHandlers())
      {
           h.close();   //must call h.close or a .LCK file will remain.
      }

这样就可以了,但又有新的 问题,这不是实验要求的结果呀,实验中还需要对所有异常情况有查询功能,这样文件中永远只有一种操作上的异常,不能保留所有操作的异常,就没办法查询了。显然pass掉这种方法。
我就开始想,之所以每次都会生成logging文件,就是因为这句语句
FileHandler filehandler = new FileHandler(“src/Logging/logging”);
log.addHandler(filehandler);
如果没有这句语句,只保留日志记录的语句,那是把异常情况写到哪里呢,我实验一下,删除所有类中的FileHandler语句,只保留主程序的,结果令我惊喜。所有其他各个类中方法的异常情况全部写到了主程序的logging文件中,而且因为主程序只会生成一个logging文件也不会存在生成无数文件的情况,那这样就可以实现日志查询功能了,只要在所有操作后查询一个logging文件就可以按照过滤条件输出所有满足条件的异常。完美。

小结

这里面显然涉及了线程安全,锁的机制,日志等java知识,我讲的主要还是如何实操以及根据实验得到的一些最浅显的原理,里面真正的原理型知识需要特别学习相关java知识才可以掌握,不然基层东西不了解,写代码会遇到很多你想破头脑都想不出来的bug。

你可能感兴趣的:(关于Java日志log.lck文件的出现原因和关闭方法)