java.util.logging.Logger 使用详解
概述:
第1部分 创建Logger对象
要使用J2SE的日志功能,首先要取得java.util.logging.Logger实例,这可以通过Logger类的两个静态getLogger()方法来取得:
static Logger getLogger(String name)
查找或创建一个logger。
static Logger getLogger(String name, String resourceBundleName)
为指定子系统查找或创建一个logger。
注意:name是Logger的名称,当名称相同时候,同一个名称的Logger只创建一个。
下面是简单范例:
public class LoggingDemo {
public static void main(String[] args){
Logger logger = Logger.getLogger("LoggingDemo"); try{
System.out.println(args[0]);
}catch(ArrayIndexOutOfBoundsException e){
logger.warning("没有提供执行时的自变量!");
}
}
}
执行结果:
第2部分 日志级别
在进行信息的记录时,依信息程序的不同,会设定不同等级的信息输出。Java log比log4j的级别详细,全部定义在java.util.logging.Level里面。
各级别按降序排列如下:
- SEVERE(最高值)
- WARNING
- INFO
- CONFIG
- FINE
- FINER
- FINEST(最低值)
此外,还有一个级别OFF,可用来关闭日志记录,使用级别ALL启用所有消息的日志记录。
logger默认的级别是INFO,比INFO更低的日志将不显示。
Logger的默认级别定义是在jre安装目录的lib下面。
# Limit the message that are printed on the console to INFO and above.
java.util.logging.ConsoleHandler.level = INFO
可以通过操作Logger上的几个方法来得到不同等级的信息输出。如下列范例:
public class LoggingDemo {
public static void main(String[] args){
Logger logger = Logger.getLogger("LoggingDemo"); logger.severe("严重信息"); logger.warning("警示信息"); logger.info("一般信息"); logger.config("设定方面的信息"); logger.fine("细微的信息"); logger.finer("更细微的信息"); logger.finest("最细微的信息");
} }
执行结果:
此示例中config()方法及以下的信息并没有显示出来,这是因为Logger的默认等级是INFO,比这个等级更低的信息,Logger并不会将信息输出。
Logger的默认等级是定义在执行环境的属性文件logging.properties中,这个文件位于JRE安装目录的lib目录下。部分内容如下:
# Limit the message that are printed on the console to INFO and above.
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
Logger默认的输出媒介控制器(Handler)是java.util.logging.ConsolerHandler,也就是将信息输出至控制台。一个Logger可以拥有多个handler,每个handler可以有自己的日志级别,在通过Logger的级别限制后,实际上还要再经过handler的级别限制。所以在上面的范例中如果想要看到所有的信息,则必须同时设定Logger与!ConsoleHandler的级别。下面的范例示范了如何设定:
public class LoggingDemo {
public static void main(String[] args){
Logger logger = Logger.getLogger("LoggingDemo"); //显示所有等级的信息
logger.setLevel(Level.ALL);
ConsoleHandler consoleHandler = new ConsoleHandler();
//显示所有等级的信息
consoleHandler.setLevel(Level.ALL);
//设定Handler为!ConsoleHandler
logger.addHandler(consoleHandler);
logger.severe("严重信息");
logger.warning("警示信息");
logger.info("一般信息");
logger.config("设定方面的信息");
logger.fine("细微的信息");
logger.finer("更细微的信息");
logger.finest("最细微的信息");
} }
执行结果:
Level.ALL表示显示所有的信息,所有这一次的执行结果可显示所有等级的信息。如果要关闭所有的信息,可以设定为Level.OFF。
Logger的Severe(),warning(),info()等方法,实际上是个便捷的方法。也可以直接使用log()方法并指定等级来执行相同的作用,如:
public class LoggingDemo {
public static void main(String[] args){
Logger logger = Logger.getLogger("LoggingDemo");
logger.log(Level.SEVERE, "严重信息test");
}
}
结果:
第3部分 Handler
Handler对象从Logger中获取日志信息,并将这些信息导出。例如,它可将这些信息写入控制台或文件中,也可以将这些信息发送到网络日志服务中,或将其转发到操作系统日志中。
Logger默认的输出处理者是ConsoleHandler。!ConsoleHandler的输出是使用System.err对象,而信息的默认等级是INFO,这可以在JRE安装目录下lib目录的logging.properties中看到:
# Limit the message that are printed on the console to INFO and above.
java.util.logging.ConsoleHandler.level = INFO
Java SE实现了5个Handler:
(1) java.util.logging.ConsoleHandler 以System.err输出日志。
(2) java.util.logging.FileHandler 将信息输出到文件。
(3) java.util.logging.!StreamHandler以指定的!OutputStream实例输出日志。
(4) java.util.logging.!SocketHandler将信息通过Socket传送至远程主机。
(5) java.util.logging.!MemoryHandler将信息暂存在内存中。
以下代码将信息输出至文件中:
public class LoggingDemo {
public static void main(String[] args){
Logger logger = Logger.getLogger("LoggingDemo"); try {
FileHandler fileHandler = new FileHandler("D:\\test/3.txt");
logger.addHandler(fileHandler);
logger.info("测试信息");
} catch (SecurityException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} }
执行结果:
D:\test\3.text内容如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE log SYSTEM "logger.dtd">
<log>
<record>
<date>2014-11-25T10:53:49</date>
<millis>1416884029723</millis>
<sequence>0</sequence>
<logger>LoggingDemo</logger>
<level>INFO</level>
<class>com.ConcurrentContainer.LoggingDemo</class>
<method>main</method>
<thread>1</thread>
<message>测试信息</message>
</record>
</log>
fileHandler默认的输出格式是XML格式。输出格式由java.util.logging.Formatter来控制,下一节详细介绍Formatter。
第4部分 Formatter
Formatter为格式化LogRecords提供支持。
一般来说,每个Handler都有关联的Formatter。Formatter接受LogRecord,并将它转换为一个字符串。
默认提供了两种Formatter:
1.java.util.logging.SimpleFormatter:标准日志格式,就是我们通常在启动一些诸如Tomcat、JBoss之类的服务器的时候经常能在控制台下看到的那种形式,就像这样:
2004-12-20 23:08:52 org.apache.coyote.http11.Http11Protocol init
信息: Initializing Coyote HTTP/1.1 on http-8080
2.java.util.logging.XMLFormatter:XML形式的日志格式,如果为Logger添加了一个new XMLFormatter(),那么就会以XML形式输出,不过更常用的是使用上面介绍的FileHandler输出到XML文件中。
从上一节的例子可知,FileHandler的默认格式是java.util.logging.XMLFormatter,而ConsolerHandler的默认格式是java.util.logging.SimpleFormatter,可以使用Handler实例的setFormatter()方法来设定信息的输出格式。例如:
fileHandler.setFormatter(new SimpleFormatter());
FileHandler的Formatter设定为SimpleFormatter,则输出的日志文件内容就是简单的文字信息,打开文件后会发现与命令行模式下看到的信息内容相同。
第5部分 自定义
1、Handler
用户可以定制自己输出媒介控制器,继承Handler即可,通常只需要实现Handler中三个未定义的抽象方法:
publish:主要方法,把日志记录写入你需要的媒介。
flush:清除缓冲区并保存数据。
close:关闭控制器。
通过重写以上三个方法可以很容易实现一个新的输出媒介控制器。
2、Formatter
除了XMLFormatter与!SimpleFormatter之外,也可以自定义日志的输出格式,只要继承抽象类Formatter,并重新定义其format()方法即可。format()方法会传入一个java.util.logging.LogRecord对象作为参数,可以使用它来取得一些与程序执行有关的信息。'
3、日志级别
Java的一个日志级别对应一个整数值,Level有9个内置的级别,分别是:
类型 对应的整数
OFF 最大整数( Integer. MAX_VALUE)
SEVERE 1000
WARNING 900
INFO 800
CONFIG 700
FINE 500
FINER 400
FINEST 300
ALL 最小整数(Integer. MIN_VALUE)
你也可以定义自己的日志级别,通过继承Level的方式,譬如:
/**
* 自定义日志级别
* @ClassName: AlertLevel
* TODO
* @author xingle
* @date 2014-11-25 上午9:54:23
*/
public class AlertLevel extends Level{ /**
* @param name
* @param value
*/
protected AlertLevel(String name, int value) {
super(name,value);
} public static void main(String[] args){
Logger logger = Logger.getAnonymousLogger();
//低于INFO(800),显示不出来,因为默认的配置 java.util.logging.ConsoleHandler.level = INFO
logger.log(new AlertLevel("ALERT",950), "自定义 lever!");
}
}
执行结果:
第6部分 Logger的层次关系
在使用Logger的静态getLogger()方法取得Logger实例时,给getLogger()方法的名称是有意义的。如果给定a,实际上将从根(Root)logger继承一些特性,像日志级别(Level)以及根logger的输出媒介控制器。如果再取得一个Logger实例,并给定名称a.b,则这次取得的Logger将继承pku这个Logger上的特性。从以下范例可以看出Logger在名称上的继承关系:
/**
* Logger的层次关系
* @ClassName: LoggerHierarchyDemo
* TODO
* @author xingle
* @date 2014-11-25 上午10:04:54
*/
public class LoggerHierarchyDemo {
public static void main(String[] args){
Logger onlyfunLogger = Logger.getLogger("a");
Logger caterpillarLogger = Logger.getLogger("a.b");
System.out.println("root logger:"+onlyfunLogger.getParent());
System.out.println("onlyfun logger:" + caterpillarLogger.getParent().getName());
System.out.println("caterpillar Logger:" + caterpillarLogger.getName() + "\n");
onlyfunLogger.setLevel(Level.WARNING);
caterpillarLogger.info("caterpillar ' info");
caterpillarLogger.setLevel(Level.INFO);
caterpillarLogger.info("caterpillar ' info");
}
}
执行结果:
getParent()方法可以取得Logger上的上层父Logger,根Logger并没有名称,所以直接调用它的toString()以取得字符串描述。当Logger没有设定等级时,则使用父Logger的等级设定,所以在上面的范例中,onlyfunLogger设定等级为WARNING时,caterpillarLogger调用info()方法时并不会有信息显示(因为WARNING等级比INFO高)。
参考 :
java.util.logging.Logger 使用详解的更多相关文章
- java.util.logging.Logger使用详解 (转)
http://lavasoft.blog.51cto.com/62575/184492/ ************************************************* java. ...
- 2.java.util.logging.Logger使用详解
一.java.util.logging.Logger简介 java.util.logging.Logger不是什么新鲜东西了,1.4就有了,可是因为log4j的存在,这个logger一直沉默着, 其实 ...
- java.util.logging.Logger使用详解
一.创建Logger对象 static Logger getLogger(String name) 为指定子系统查找或创建一个 logger. static Logger ge ...
- java.util.logging jdk日志详解
jdk自带的日志,结构并不复杂,功能也能满足绝大部分功能.日志写入位置是开放的,只要继承了handler都可以接收日志的写入.handler本身依赖于LogRecord对象,该对象代表一个日志.Han ...
- java.util.logging.Logger基础教程
从JDK1.4开始即引入与日志相关的类java.util.logging.Logger,但由于Log4J的存在,一直未能广泛使用.综合网上各类说法,大致认为: (1)Logger:适用于小型系统,当日 ...
- Java日志工具之java.util.logging.Logger
今天总结下JDK自带的日志工具Logger,虽然它一直默默无闻,但有时使用它却比较方便.更详细的信息可以查看JDK API手册,本文只是简单示例入门. 创建Logger 我们可以使用Logger的工厂 ...
- java.util.logging.Logger基础
1. 定义 java.util.logging.Logger是Java自带的日志类,可以记录程序运行中所产生的日志.通过查看所产生的日志文件,可以分析程序的运行状况,出现异常时,分析及定位异常. 2. ...
- java.util.logging.Logger使用具体解释
java.util.logging.Logger不是什么新奇东西了,1.4就有了,但是由于log4j的存在,这个logger一直沉默着,事实上在一些測试性的代码中,jdk自带的logger比log4j ...
- 通配置文件的方式控制java.util.logging.Logger日志输出
转自:http://zochen.iteye.com/blog/616151 简单的实现了下利用JDK中类java.util.logging.Logger来记录日志.主要在于仿照log4j方式用配置文 ...
随机推荐
- 【转】ubuntu 重启命令,ubuntu 重启网卡方法
ubuntu 重启命令 重启命令:1.reboot2.shutdown -r now 立刻重启(root用户使用)3.shutdown -r 10 过10分钟自动重启(root用户使用)4.shutd ...
- Python快速建站系列-Part.Three-注册和登录
|版权声明:本文为博主原创文章,未经博主允许不得转载. 上一个Part已经给TSSS编好了一个简单的Web服务,网页的基础模版也写好了,那从这个Part开始就慢慢增加编写功能. 先写基础功能:注册和登 ...
- SQLServer 使用smb存放数据文件
安装smb: 服务器管理器->角色->文件服务 1.配置smb共享时,更改NTFS权限,需要将SQLServer启动域帐户加入,读.写.完全控制等权限 2.实例启动用户需要使用域帐户 3. ...
- 从表中删除重复记录的sql
--有一个表,假设是这样的 CREATE TABLE Test ( field1 ) primary key, field2 )); --假设field1上有索引. 要删除表中所有field1重复的记 ...
- @weakify, @strongify ObjC的Block中使用weakSelf/strongSelf @weakify/@strongify
首先要说说什么时候使用weakSelf和strongSelf. 下面引用一篇博客<到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf>的内容: Objec ...
- Editplus配置VC++(1) 及相关注意事项
下篇文章:Editplus配置VC++(2) 与/d1reportSingleClassLayout 原本用的是VC++2010 现在换成了Visual Studio 2013,editplus相关配 ...
- java并发编程参考资料
1.java编程思想 2.java并发编程实战 3.java并发编程的艺术 4.http://www.infoq.com/cn/author/%E7%A8%8B%E6%99%93%E6%98%8E#文 ...
- python之redis
Redis简单介绍 如果简单地比较Redis与Memcached的区别,大多数都会得到以下观点:1 Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构 ...
- OpenCV安装配置的简单记录
在ubuntu16.04下安装OpenCV 2.4.11的简单记录 1. 安装cmake,执行$apt-get install cmake即可,cmake -version验证 2. 下载OpenCV ...
- 从零开始学iPhone开发(4)——使用WebView
转自 总结关于iPhone中UIWEBVIEW读取本地GBK编码格式html 关于webView读取本地GBK编码的html,尝试了两天,终于成功. 欢喜之余,把感想记下来.一般来说,不成都是人犯错, ...