20145205 《Java程序设计》第8周学习总结
2016-04-24 22:13
330 查看
教材学习内容总结
第十五章 通用API15.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组态,较使用程序撰写更为方便。
15.2.1 使用ResourceBundle
ResourceBundle的静态
getBundle()方法会取得一个
ResourceBundle的实例,所给定的自变量名称是信息文档的主文件名,
getBundle()会自动找到对应的.
properties文档,取得
ResourceBundle实例后,可以使用
getString()指定键来取得。
15.2.2 使用Locale
国际化的三个标准是地区
(Locale)信息、资源包
(Resource bundle)与基础名称
(Base name)
P471 LoggerDemo 运行结果
P474 LoggerDemo2 运行结果
P488 ReplaceDemo 运行结果
P489 SplitDemo2 运行结果
P483 SplitDemo 运行结果
P489 SplitDemo3 运行结果
遇到的问题
本章的一个代码,我在敲上去之后,并且按照书上运行的后显示了如上的错误,但是我并没有调试出来= =,这就很尴尬了。
其他(感悟、思考等,可选)
本周虽然学习量相比于前几周不算多,代码也不多,而且有着之前的基础也不是很难,但是我感觉学习的压力却比以往更大,因为本周终于体会到了欠下的总是要还的这句话,因为之前用git推代码的时候,出来了错误,也没有去理她,但是本周的实验的却需要git,所以一直在忙于调试git,所以很尴尬,虽然有些时候会很累,但是不能留下尾巴,不然真的会很麻烦的。学习也是一样,如果自己不去解决遇到的问题,越拖越大,早晚一天会出现大的问题。学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 4500行 | 25篇 | 350小时 | |
第一周 | 100/100 | 1/2 | 15/15 | |
第二周 | 150/250 | 1/3 | 12/27 | |
第三周 | 400/650 | 1/4 | 22/49 | |
第四周 | 510/1160 | 1/5 | 32/81 | |
第五周 | 831/1991 | 1/6 | 35/116 | |
第六周 | 945/1991 | 2/6 | 26/142 | |
第七周 | 236/2227 | 3/9 | 18/160 | |
第八周 | 267/2494 | 2/11 | 18/178 |
参考资料
Java学习笔记(第8版)《Java学习笔记(第8版)》学习指导
相关文章推荐
- 20145206《Java程序设计》实验三实验报告
- Java并发:主线程等待多个子线程执行完才继续执行
- Java并发:等待事件发生后所有线程继续执行
- 20145322何志威 《Java程序设计》第8周学习总结
- Java的构造方法
- java.util包---LinkedList
- JavaWeb学习笔记——jsp内置对象
- java并发之concurrent包的结构
- 20145211 《Java程序设计》实验报告三:敏捷开发与XP实践
- java.util包---LinkedHashSet
- Java第八周学习总结
- Spring定时任务的几种实现详解
- JAVA字符串格式化-String.format()的使用
- 20145321 《Java程序设计》第8周学习总结
- 20145206邹京儒《Java程序设计》第8周学习总结
- java字符串的替换replace、replaceAll、replaceFirst的区别详解
- 趣味素数-平方回文素数-java
- java.util包---LinkedHashMap
- Java编程基础--空指针异常
- java注解