Java日志工具之java.util.logging.Logger
今天总结下JDK自带的日志工具Logger,虽然它一直默默无闻,但有时使用它却比较方便。更详细的信息可以查看JDK API手册,本文只是简单示例入门。
创建Logger
我们可以使用Logger的工厂方法
public static Logger getLogger(String name)
来创建,其中name是logger 的名称,这应该是一个圆点分隔的名称,并且通常应该基于子系统的包名或类名(如net.oseye),这是就Logger的名称空间。如果已经创建了具有给定名称的 logger,则返回该 logger。否则创建一个新的 logger。
每个Logger都有一个"父"Logger,也就是 Logger 名称空间中与其最近的现有祖先,而最顶层有个“Root”Logger,是所有Logger的顶级祖先。
Logger的级别
Level 类定义了一组可用来控制日志输出的标准日志级别。日志 Level 对象是有序的,并且是通过有序的整数来指定。在给定的级别上启用日志记录也就启用了所有较高级别的日志记录。 客户机一般应该使用预定义的 Level 常量(如 Level.SEVERE)。
Logger的级别是比较详细,全部定义在java.util.logging.Level里面,各级别按降序排列如下:
SEVERE(最高值)
WARNING
INFO
CONFIG
FINE
FINER
FINEST(最低值)
此外,还有一个级别 OFF,可用来关闭日志记录,使用级别 ALL 启用所有消息的日志记录。
每个Logger都只关心自己的最低 Level。如果将 Logger 的级别设置为 null,那么它的有效级别继承自父 Logger,这可以通过其父 Logger 一直沿树向上递归得到。
logger默认的级别是INFO,比INFO更低的日志将不显示,Logger的默认级别定义是在jre安装目录的lib下的logging.properties(properties的使用讲解)文件中:
############################################################
# Global properties
############################################################
.....
# Default global logging level.
# This specifies which kinds of events are logged across
# all loggers. For any given facility this global level
# can be overriden by a facility specific level
# Note that the ConsoleHandler also has a separate level
# setting to limit messages printed to the console.
.level= INFO
简单示例
package net.oseye;
import java.util.logging.Logger;
public class RunMain { public static void main(String[] args) {
Logger log=Logger.getLogger("oseye");
Logger logtmp=Logger.getLogger("oseye");
log.fine("fine日志测试");
log.info("info日志测试");
log.warning("warning日志测试");
System.out.println(log==logtmp);
System.out.println(System.getProperty("java.home"));
}
}
输出:
三月 15, 2014 11:14:04 上午 net.oseye.RunMain main
INFO: info日志测试
三月 15, 2014 11:14:04 上午 net.oseye.RunMain main
WARNING: warning日志测试
true
C:\Program Files\Java\jre7
可以看到比info级别低的fine日志没有显示,而log和logtmp都是名为"oseye"的Logger。
此时你可以修改logging.properties来设置级别,但首先需要确定你用的那个JRE(安装JDK后会有多个JRE),只有找到正确的JRE修改的配置才有效,本例中使用的JRE是:
C:\Program Files\Java\jre7
Logger的Handler
Handler 对象从 Logger 中获取日志信息,并将这些信息导出,而且向父级递归传递信息。例如,它可将这些信息写入控制台或文件中,也可以将这些信息发送到网络日志服务中,或将其转发到操作系统日志中。 Handler 类通常使用 LogManager 属性来设置 Handler 的 Filter、Formatter 和 Level 的默认值。Handler的子类如下:

java.util.logging.Handler
java.util.logging.MemoryHandler
java.util.logging.StreamHandler
java.util.logging.ConsoleHandler
java.util.logging.FileHandler
java.util.logging.SocketHandler
可以使用下面的方法来操作Handler:
public void addHandler(Handler handler) //添加
public void removeHandler(Handler handler) //删除
public Handler[] getHandlers() //获取
public void setUseParentHandlers(boolean useParentHandlers) //是否应该将其输出发送到它的父 Logger
示例代码:
package net.oseye; import java.util.logging.ConsoleHandler;
import java.util.logging.Handler;
import java.util.logging.Logger; public class RunMain { public static void main(String[] args) {
Logger log=Logger.getLogger("oseye");
Handler[] handleList=log.getHandlers();
System.out.println("oseye的handler数:"+handleList.length);
handleList=log.getParent().getHandlers();
System.out.println("oseye的父级handler数:"+handleList.length);
for(Handler h:handleList){
System.out.println(h);
}
log.addHandler(new ConsoleHandler());
log.info("两个handler处理,一个自定义,另一个是祖先");
}
}
输出:
oseye的handler数:0
oseye的父级handler数:1
java.util.logging.ConsoleHandler@125844f
三月 15, 2014 11:35:12 上午 net.oseye.RunMain main
INFO: 两个handler处理,一个自定义,另一个是祖先
三月 15, 2014 11:35:12 上午 net.oseye.RunMain main
INFO: 两个handler处理,一个自定义,另一个是祖先
- 默认的oseye是没有handler的,但其父级有默认的是ConsoleHander,这个可以在默认的logging.properties配置文件可以看到:
handlers= java.util.logging.ConsoleHandler
- 增加了一个ConsoleHandler,可以看到信息是向上传递的,直到达到顶层,但可以使用setUseParentHandlers来设置是否传递;
- 每个handler也可以设置自己的Level,这个留给你当家庭作业吧。
日志内容的格式化
一般来说,每个日志记录 Handler 都有关联的 Formatter。Formatter 接受 LogRecord,并将它转换为一个字符串。 有些 Formatter(如 XMLFormatter)需要围绕一组格式化记录来包装头部和尾部字符串。可以使用 getHeader 和 getTail 方法来获得这些字符串。
package net.oseye; import java.io.File;
import java.util.logging.FileHandler;
import java.util.logging.Formatter;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger; public class RunMain { public static void main(String[] args) throws Exception {
Logger log=Logger.getLogger("oseye");
FileHandler fileHandler=new FileHandler("d:"+File.separator+"log.txt");
fileHandler.setFormatter(new Formatter() { @Override
public String format(LogRecord arg0) {
return arg0.getLoggerName()+"\t"+arg0.getLevel()+"\t"+arg0.getMessage();
}
});
fileHandler.setLevel(Level.WARNING);
log.addHandler(fileHandler); log.setUseParentHandlers(false);
log.warning("警告信息");
}
}
示例中使用了FileHandler,而且禁止日志消息向上传递,在"d:\log.txt"中可以看到:
oseye WARNING 警告信息
在setFormatter时我使用匿名类(你可以使用别的方式),其中LogRecord 对象用于在日志框架和单个日志 Handler 之间传递日志请求。
自定义配置文件
自定义配置文件有两种方式:
- Logger默认的是使用jre安装目录的lib下的logging.properties配置文件,但logging.properties明确的给出使用其他自定义配置文件的说明:
############################################################
# Default Logging Configuration File
#
# You can use a different file by specifying a filename
# with the java.util.logging.config.file system property.
# For example java -Djava.util.logging.config.file=myfile
############################################################因此如果你的配置文件是"d:\logging.properties",当你执行的使用这样用即可:
java -Djava.util.logging.config.file=d:\logging.properties net.oseye.RunMain
- 使用LogManager
Logger默认的是使用jre安装目录的lib下的logging.properties配置文件,这可以从java.util.logging.LogManager的代码看出:
从代码中我们可以有两种方式加载自定义配置文件,第一种是指定加载自定义的LogManager类,然后再在LogManager来加载自定义配置文件;第二种方式是通过设置"java.util.logging.config.file"系统属性,从而加载自定义配置文件。
我们用第二种示例,第一种作为家庭作业吧package net.oseye;
import java.util.logging.Logger; public class RunMain {
public static void main(String[] args) throws Exception {
System.setProperty("java.util.logging.config.file", "d:\\logging.properties");
Logger log = Logger.getLogger("oseye");
log.warning("警告信息");
}
}上面示例我用的是绝对路径,实际生成中切记不可如此,可根据需求自己修改。
Java日志工具之java.util.logging.Logger的更多相关文章
- Java日志工具之Log4J
Log4J与java.util.logging.Logger的使用方式出奇的相似,因此如果先看这篇文章<Java日志工具之java.util.logging.Logger>在来用Log4J ...
- Java日志组件1---Jdk自带Logger(java.util.logging.Logger)
最近在看日志的一些东西,发现利用JDK自带的log也可以简单的实现日志的输出,将日志写入文件的过程记录如下: 1.新建LogUtil.Java( 里面写了几个静态方法,为log设置等级.添加log控制 ...
- Java日志介绍(1)-java.util.logging.Logger
java.util.logging.Logger是JDK自带的日志工具,其简单实现了日志的功能,不是很完善,所以在实际应用中使用的比较少.本文直接用代码演示其使用方法,文中所使用到的软件版本:Java ...
- 通配置文件的方式控制java.util.logging.Logger日志输出
转自:http://zochen.iteye.com/blog/616151 简单的实现了下利用JDK中类java.util.logging.Logger来记录日志.主要在于仿照log4j方式用配置文 ...
- 【java】java自带的java.util.logging.Logger日志功能
偶然翻阅到一篇文章,注意到Java自带的Logger日志功能,特地来细细的看一看,记录一下. 1.Java自带的日志功能,默认的配置 ①Logger的默认配置,位置在JRE安装目录下lib中的logg ...
- java.util.logging.Logger 使用详解
概述: 第1部分 创建Logger对象 第2部分 日志级别 第3部分 Handler 第4部分 Formatter 第5部分 自定义 第6部分 Logger的层次关系 参考 第1部分 创建Logger ...
- java.util.logging.Logger基础教程
从JDK1.4开始即引入与日志相关的类java.util.logging.Logger,但由于Log4J的存在,一直未能广泛使用.综合网上各类说法,大致认为: (1)Logger:适用于小型系统,当日 ...
- java.util.logging.Logger基础
1. 定义 java.util.logging.Logger是Java自带的日志类,可以记录程序运行中所产生的日志.通过查看所产生的日志文件,可以分析程序的运行状况,出现异常时,分析及定位异常. 2. ...
- 2.java.util.logging.Logger使用详解
一.java.util.logging.Logger简介 java.util.logging.Logger不是什么新鲜东西了,1.4就有了,可是因为log4j的存在,这个logger一直沉默着, 其实 ...
随机推荐
- http之head请求(转)
HTTP请求方法并不是只有GET和POST,只是最常用的.据RFC2616标准(现行的HTTP/1.1)得知,通常有以下8种方法:OPTIONS.GET.HEAD.POST.PUT.DELETE.TR ...
- jQuery 的 ready 函数是如何工作的?(源码分析)
如果你使用过 jQuery , 就必然使用过 ready 函数,它用来注册当页面准备好之后可以执行的函数. 问题来啦,我们的页面什么时候准备好了呢? 1. onload 事件 最基本的处理方式就是页面 ...
- 上传预览 easyui部分控件获取focuse 表单验证
js: $(document).ready(function () { //$('#creater').combobox({ // url: '/VMS.UI/BindData/ScheamData? ...
- 在Windows下开发Node.js的C/C++原生扩展
准备工作 (1)本机系统说明:本人机器为win7 64位,32位也可以. (2)软件安装: VISUAL C++ 2010 EXPRESS(Visual Studio 2010也可以): window ...
- 【G】开源的分布式部署解决方案(二) - 好项目是从烂项目基础上重构出来的
分析目前项目结构 眼前出现这么一坨坨的文件夹,相信很多人已经看不下去了.是的,首先就是要把它给做掉. 按照这个项目文件夹的命名意图,大概可以划分如下: 1.Business:业务代码 2.Data:数 ...
- ArcGIS API for JavaScript 4.2学习笔记[5] 官方API大章节概述与内容转译
内容如上,截图自ESRI官网,连接:ArcGIS API for JavaScript 4.2 [Get Started] 类似于绪论一样的东西,抽取了最需要关注的几个例子.如:加载Map和View, ...
- Dubbo源码学习文章目录
目录 Dubbo源码学习--服务是如何发布的 Dubbo源码学习--服务是如何引用的 Dubbo源码学习--注册中心分析 Dubbo源码学习--集群负载均衡算法的实现
- .net core中加载lua脚本的类库: MoonSharp
前言 MoonSharp是一个支持C#调用lua脚本的类库,支持.net, .net core, mono, unity,因此在.net core中也能够使用,而且加载和调用lua也很方便简单: 官网 ...
- redis&rabbitMQ安装
前言: 学习python已经有一段时间了,最近在学twisted(博客:twisted安装),redis,rabbitMQ感觉有点难度,所以还是写下博客整理下. 一.Redis的安装 redis是一种 ...
- oracle_角色
一. 每个Oracle用户都有一个名字和口令,并拥有一些由其创建的表.视图和其他资源. Oracle角色(role)就是一组权限(privilege) (或者是每个用户根据其状态和条件所需的访问类型) ...