目录
Lab4中使用Java.util.logging.Logger管理日志文件。
实现日志管理
在主函数Main中对日志管理进行维护。
在后续的日志创建中如果 Logger.getLogger(String name)的 name 参数和上述三个之一相同,那么日志变量将指向同一块内存,即使用同一个logger。
然后将日志的输出语言设置为英文。
接着设置日志显示信息的最低级别,即包括了INFO, WARNING 和 SEVERE。
至此,日志的配置算是初步完成了。
使用FileHandler实现文件读写功能,在写好的路径下需要先创建好相应的文件,否则会抛出找不到文件的异常。
然后配置文件写入的格式,在这里采用SimpleFormatter格式文件,因为其可读性高。
接着对三个 logger 配置加入相应的文件管理,使得日志可以写入到文件中。
这样日志配置就基本完成了。
其它可能存在的问题
有多个类都需要写入同一个日志文件
这个问题比较简单,只需要在其它需要写入日志的类中添加全局静态变量,调用已经创建的相关的logger。
再设置无需从控制台输出日志内容即可。
日志文件输出的日期格式不符合yy-MM-dd HH:mm:ss
初始日期的设置格式是这样的。
这非常不符合常见的阅读方式,而想把它改成yy-MM-dd HH:mm:ss的方法也很简单。
通过跟踪代码可以发现,在 new FileHandler()的时候,里面的具体实现是这样的。
而其中configure()方法的第一句是
LogManager manager = LogManager.getLogManager();
再查看getLogManager(),发现它调用了readPrimordialConfiguration()方法。
继续查看readPrimordialConfiguration()方法,会发现程序读取了名称为logging.properties的配置文件。
打开该文件会发现其无法编辑,所以需要先复制一个副本,编辑成功后再取代原文件。
文件内容如下。
而想要获得特定格式的日期只需要加入一句话,及下面截图的第二句java.util.logging.SimpleFormatter.format=%1
t
F
tF %1
tFtH:%1
t
M
:
tM:%1
tM:tS %2
s
s%n%4
ss: %5
s
s%6
ss%n :
修改完成后,将修改后的文件替换原目录下的文件,此时输出日志格式如下:
调用日志查询功能结束后抛出了java.util.NoSuchElementException
原因
在子函数中,声明了scanner对象,并且调用了close方法,返回原函数时再次启动scanner时,就会遇到异常。
解决方法
- 使用多次Scanner时,只在最外层或者最后一次调用close方法。
- 将scanner对象定义为static,放在最外层,并且仅最后调用close方法。
调用日志管理功能过程出现.lck结尾的空文件
原因
这是因为没有正常关闭FileHandler所致。
解决方法
只要正常退出程序并且关闭FileHandler就不会出现这样的情况了。
调用日志管理功能过程中出现.log.1、.log.2等等的文件,并且其中也写入了日志
原因
这是因为FileHandler无法对已经打开的文件进行写入,所以只能创建同名称的新文件并写入日志。
解决方法
关闭要涉及的日志文件再启动日志管理功能。