20145205 《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
组态,较使用程序撰写更为方便。
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 |
参考资料
20145205 《Java程序设计》第8周学习总结的更多相关文章
- 20145213《Java程序设计》第九周学习总结
20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...
- 20145213《Java程序设计》第二周学习总结
20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...
- 20145213《Java程序设计》第一周学习总结
20145213<Java程序设计>第一周学习总结 教材学习内容总结 期待了一个寒假,终于见识到了神秘的娄老师和他的Java课.虽说算不上金风玉露一相逢,没有胜却人间无数也是情理之中,但娄 ...
- 21045308刘昊阳 《Java程序设计》第九周学习总结
21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...
- 20145330孙文馨 《Java程序设计》第一周学习总结
20145330孙文馨 <Java程序设计>第一周学习总结 教材学习内容总结 刚开始拿到这么厚一本书说没有压力是不可能的,开始从头看觉得很陌生进入不了状态,就稍微会有一点焦虑的感觉.于是就 ...
- 20145337 《Java程序设计》第九周学习总结
20145337 <Java程序设计>第九周学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC可以 ...
- 20145337 《Java程序设计》第二周学习总结
20145337 <Java程序设计>第二周学习总结 教材学习内容总结 Java可分基本类型与类类型: 基本类型分整数(short.int.long).字节(byte).浮点数(float ...
- 20145218《Java程序设计》第一周学习总结
20145218 <Java程序设计>第一周学习总结 教材学习内容总结 今天下午看了Java学习的视频,感觉很是新奇,之前觉得Java学起来是艰难枯燥的,但通过第一章的学习觉得如果自己可以 ...
- 《Java程序设计》第九周学习总结
20145224 <Java程序设计>第九周学习总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的 ...
- 《Java程序设计》第二周学习总结
20145224陈颢文<Java程序设计>第二周学习总结 教材学习内容总结 一.类型.变量与运算符 1.类型 整数: 可细分为为short整数(占2字节),int整数(占4字节),long ...
随机推荐
- 关于当传过来的值转换成string类型报错的问题
有时候直接写 string str=request.param["str"].tostring;会报错,是因为接受到的值可能是空的 这个时候就可以这样写 string _actio ...
- Github.com的Git和TortoiseGit图文教程
图文介绍Windows系统下使用 Github账户 + msysgit + TortoiseGit 进行文件管理的方法. 安装 安装mysysgit 下载地址:msysgit 安装过程: 0.启动 1 ...
- 如何让Linux定时任务crond以秒为单位执行(如每隔3秒)
需要用到Shell脚本每隔3秒钟去监控一个软件进程的运行状态,发现crond似乎只支持到分,不知道秒,怎么办呢? 第一种方法: 当然首先想到的是写一个触发的脚本,在触发脚本中使用死循环来解决此问题,如 ...
- shell--1.shell 相关及变量
1.shell脚本解释器 Bourme Shell (/usr/bin/sh 或 /bin/sh ) Bourme Again Shell ( /bin/bash ) C Shell ( /usr/b ...
- HahsRouter hash 路由
无刷新页面,切换视图,用hash 实现路由切换,本身附带history记录,简单舒服. 最近用vue,看到vue-route的路由,做单页应用切换视图真心易如反掌,分分钟爽到不行.为了加深理解其内涵原 ...
- MFC之进度条CProgressCtrl
一.成员函数简介 1.create()针对不是通过资源文件上拖拉进度条控件生成的进度条,需要用此函数创建一个. 2.SetRange()设置进度条的起始值和终止值. 3.SetPos()设置进度条的当 ...
- 用 nssm 把 Nginx 安装成 Windows 服务方法
总之:用 nssm 比 srvany.exe 简便多了.1. 下载nginx windows版本:http://nginx.org/ 2. 下载 nssm :http://nssm.cc/3. 安装N ...
- 数据库Sharding的基本思想和切分策略
一.基本思想 Sharding的基本思想就要把一个数据库切分成多个部分放到不同的数据库(server)上,从而缓解单一数据库的性能问题.不太严格的讲,对于海量数据的数据库,如果是因为表多而数据多,这时 ...
- ecshop二次开发常用代码
通过index控制循环次数.在循环中将index作为if的判断条件,对循环进行控制.这里index是从0开始的.如果index<2,会进行两次循环. <!--{foreach from=$ ...
- 【GoLang】golang 闭包 closure 参数传递的蹊跷!
结论: 闭包函数可以直接引用外层代码定义的变量, 但是,注意,闭包函数里面引用的是变量的地址, 当goroutine被调度时,改地址的值才会被传递给goroutine 函数. 介绍 go的闭包是一个很 ...