20155206 2016-2017-2 《Java程序设计》第8周学习总结
20155206 2016-2017-2 《Java程序设计》第8周学习总结
教材学习内容总结
第十五章 通用API
15.1 日志
日志API简介
java.util.logging
包提供了日志功能相关类与接口,不必额外配置日志组件,就可在标准Java平台使用是其好处。使用日志的起点是Logger
类,Logger
类的构造函数标示为protected
,不是java.util.logging
同包的类不能直接以new
创建,要取得Logger
实例,必修使用Logger
的静态方法getLogger()
。
调用getLogger()
时,必须指定Logger
实例所属名称空间,名称空间以“.”作为层级区分,名称空间层级相同的Logger
,其父Logger
组态相同。通常在哪个类中取得的Logger
,名称空间就会命名为哪个类全名。
简单来说,Logger
是记录信息的起点,要输出的信息,必须先通过Logger
的Lever
与Filter
过滤,在通过Handler
的Lever
与Filter
过滤,格式化信息的动作交给Formatter
,输出信息的动作实际上是Handler
负责。
Logger
有层级关系,名称空间层级相同的Logger
,父Logger
组态会相同,每个Logger
处理完自己的日志动作后,会向父Logger
传播,让父Logger
也可以处理日志。
指定日志层级
取得的Logger
实例之父Logger
组态,就是Logger.GLOBAL_LOGGER_NAME
名称空间Logger
实例,可通过getParent()
取得设定的Logger
实例,可通过getLevel()
取得设定的Level
实例。
Logger
的信息处理会往父Logger
传播,在没有做任何组态设定的情况下,默认取得的Logger
实例,层级必须大于或等于Logger.GLOBAL_LOGGER_NAME
名称空间Logger
实例设定的Lever.INFO
,才有可能输出信息。
可以通过setLevel()
设定Level
实例,若log()
时指定的Lever
实例内含的int
值小于Logger
设定的Level
实例内含的int
值,Level
就不会记录信息。
在经过Logger
过滤之后,还得再经过Handler
的过滤,一个Logger
可以拥有多个Handler
,可通Logger
的addHandler()
新增Handler
实例。实际上进行信息输出时,目前Logger
的Handler
处理完,还会传播给父Logger
的所有Handler
处理,可通过getHandlers()
方法取得目前已有的Handler实例数组。
在没有做任何组态设定的情况下,取得的Logger
实例,只会使用Logger.GLOBAL_LOGGER_NAME
名称空间Logger
实例拥有的Handler
,默认是使用ConsoleHandler
,为Handler
的子类,作用是在控制台下输出日志信息,,默认地层级是Level.INFO
。
使用Handler
与Formatter
负责日志输出的是Handler
实例。标准API中提供几个Handler
操作类:
MemoryHandler
不会格式化日志信息,信息会暂存于内存缓冲区,直到超过缓冲区大小,才将信息输出至指定的目标Handler
。
StreamHandler
可自行指定信息输出时使用的OutputStream
实例,它与子类都会使用指定Formatter
格式化信息。
ConsoleHandler
创建时,会自动指定OutputStream为System.err
,所以日志信息会显示在控制台。
FileHandler
创建时会建立日志输出时使用的FileOutputStream
,文档位置与名称可以使用模式Pattern
字符串指定。
SocketHandler
创建时可以指定主机位置与端口,内部将自动建立网络联机,将日志信息传送至指定的主机。
Logger
可以使用addHandler()
新增Handler
实例,使用removeHandler()
移除Handler
。
FileHandler
默认的Formatter
是XMLFormatter
;
ConsoleHandler
默认使用SimpleFormatter
;这两个类是Formatter
的子类,可以通过Handler
的setFormatter()
方法设定Formatter
。
自定义Handler
、Formatter
与Filter
如果java.util.logging
包中提供的Handler
成果都不符合需求,可以继承Handler
类,操作抽象方法publish()
、flush()
与close()
方法来自定义Handler
。
在职责分配上,Handler
是负责输出,格式化是交由Formatter
,而信息过滤是交由Filter
。Handler
有默认的isLoggable()
操作,会先依据Level
过滤信息,再使用指定的Filter
过滤信息。format()
方法会传入LogRecord
,存储所有日志信息。
Logger
与Handler
默认只会一句层级过滤信息,Logger
与Handler
都有setFilter()
方法,可以指定Filter操作对象。 使用
logging.properties 通过
logging.properties来设定
Logger`组态,较使用程序撰写更为方便。
代码调试中的问题和解决过程
本章的一个代码,我在敲上去之后,并且按照书上运行的后显示了如上的错误,但是我并没有调试出来= =
代码托管
结对及互评
博客评论
20155326
20155215
20155314
20155203
20155235
20155237
学习进度条
|第八周 |900/2355 |1/1 |30 |