Java中的日志——Java.util.logging、log4j、commons-logging
Java中给项目程序添加log主要有三种方式,一使用JDK中的java.util.logging包,一种是log4j,一种是commons-logging。其中log4j和commons-logging都是apache软件基金会的开源项目。这三种方式的区别如下:
Java.util.logging,JDK标准库中的类,是JDK 1.4 版本之后添加的日志记录的功能包。
log4j,最强大的记录日志的方式。可以通过配置 .properties 或是 .xml 的文件, 配置日志的目的地,格式等等。
commons-logging,最综合和常见的日志记录方式,是Java中的一个日志接口,一般会与log4j一起使用。自带SimpleLog可用于日志记录。
1.Java.util.logging
【例1.1】:日志的简单使用
- package lwf.log.test;
- import java.util.logging.Logger;
- public class LogTest {
- static String strClassName = LogTest.class.getName();
- static Logger logger = Logger.getLogger(strClassName);
- public static double division(int value1, int value2) {
- double result = 0;
- try {
- result = value1 / value2;
- } catch(ArithmeticException e) {
- logger.warning("除数不能为0.");
- e.printStackTrace();
- }
- return result;
- }
- public static void main(String[] args) {
- System.out.println(division(5, 0));
- }
- }
结果:
从这个例子中你会看到控制台上输出了日期时间,类名,方法名和“[warning]除数不能为0.”的信息。
Logger是Java Logging API中的一个类,Logger.getLogger方法创建了一个Logger实例。每一个Logger实例都必须有个名称,通常的做法是使用类名称定义Logger实例。
logger.warning方法用来输出日志信息,除了warning处,还有severe、info等。我们可以把【例1】再改一下,让其输出各种日志信息。
【例1.2】:日志的级别
- public static double division(int value1, int value2) {
- double result = 0;
- try {
- result = value1 / value2;
- } catch(ArithmeticException e) {
- logger.severe("[severe]除数不能为0.");
- logger.warning("[warning]除数不能为0.");
- logger.info("[info]除数不能为0.");
- logger.config("[config]除数不能为0.");
- logger.fine("[fine]除数不能为0.");
- logger.finer("[finer]除数不能为0.");
- logger.finest("[finest]除数不能为0.");
- e.printStackTrace();
- }
- return result;
- }
结果:
Java Logging API提供了七个日志级别用来控制输出。这七个级别分别是:
级别 |
SEVERE |
WARNING |
INFO |
CONFIG |
FINE |
FINER |
FINEST |
调用方法 |
severe() |
warning() |
info() |
config() |
fine() |
finer() |
finest() |
含意 |
严重 |
警告 |
信息 |
配置 |
良好 |
较好 |
最好 |
但在上面的例子中我们可以看到只输出了SEVERE、WARNING、INFO三个等级的日志,并没有如我们相像中的好样输出各个级别的日志信息。这是因为默认日志输出级别的设置是info,也就是说只有info或它以上的级别被输出,它以下的级别不被输出。那如何修改这个设置呢?
日志(Log)的配制:
1.代码设置
使用setLevel();但这种方式不能改变console的级别,只能改变输出到文件的日志的级别。
2.修改logging.properties
默认的外部配置文件 是JRE中lib/logging.properties文件。你可以打开这个文件,修改以下两行为:
.level=ALL //... |
这种方式会影响jre下所有用户。
为了不影响到所有的用户,我们还可以通过LogManager的readConfiguration(InputStream ins)读取指定的配制文件。
【例1.3】:LogManager管理日志
- package lwf.log.test;
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.logging.FileHandler;
- import java.util.logging.Handler;
- import java.util.logging.Level;
- import java.util.logging.LogManager;
- import java.util.logging.LogRecord;
- import java.util.logging.Logger;
- import java.util.logging.SimpleFormatter;
- public class LogTest {
- static String strClassName = LogTest.class.getName();
- static Logger logger = Logger.getLogger(strClassName);
- static LogManager logManager = LogManager.getLogManager();
- static {
- InputStream inputStream = null;
- try {
- //读取配制文件
- inputStream = LogTest.class.getClassLoader().getResourceAsStream("log.properties");
- logManager.readConfiguration(inputStream);
- //添加Logger
- logManager.addLogger(logger);
- } catch (SecurityException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public static double division(int value1, int value2) {
- double result = 0;
- try {
- result = value1 / value2;
- } catch(ArithmeticException e) {
- logger.severe("[severe]除数不能为0.");
- logger.warning("[warning]除数不能为0.");
- logger.info("[info]除数不能为0.");
- logger.config("[config]除数不能为0.");
- logger.fine("[fine]除数不能为0.");
- logger.finer("[finer]除数不能为0.");
- logger.finest("[finest]除数不能为0.");
- e.printStackTrace();
- }
- return result;
- }
- public static void main(String[] args) {
- System.out.println(division(5, 0));
- }
- }
log.properties:
# "handlers" specifies a comma separated list of log Handler #handlers= java.util.logging.ConsoleHandler handlers= java.util.logging.FileHandler # Default logging level. .level= CONFIG # default file output is in "E:\Test" directory. java.util.logging.FileHandler.pattern = E:/Test/Log%u.log java.util.logging.FileHandler.limit = 50000 java.util.logging.FileHandler.count = 1 java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter # Limit the message that are printed on the console to CONFIG and above. java.util.logging.ConsoleHandler.level = CONFIG java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter # Facility specific properties.Provides extra control for each logger. # For example, set the com.xyz.foo logger to only log SEVERE messages: com.xyz.foo.level = SEVERE |
这样,用户就可以自己定义配制文件了。在E:\Test下可以看到输出的日志文件Log0.log
java.util.logging包中类的关系图如下:
参考文章:
http://blog.csdn.net/dl88250/article/details/1843813
2.log4j
1.项目串导入log4j的jar包
如Eclipse下项目名右键,Build Path\Add Libraries,添加一组用户自己的jar包。项目结构如下:
2.修改log4j的配制文件,设置日志输出的级别、格式等
log4j的log有5个级别:FATAL(严重的 )、ERROR(错误 )、WARN(警告)、INFO(信息)、DEBUG(调试 )。
3.在项目代码中适当添加日志。
【例2.1】
log4j.properties:
#set log level: show debug, info, error log4j.rootLogger=DEBUG, A1 # A1 is set to be a ConsoleAppender which outputs to System.out. #log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1=org.apache.log4j.FileAppender # A1 uses PatternLayout. log4j.appender.A1.layout=org.apache.log4j.PatternLayout #out log4j.appender.A1.File=E:/test/log4j.log # set log output format's style log4j.appender.A1.layout=org.apache.log4j.TTCCLayout |
代码:
- package lwf.log.test;
- import org.apache.log4j.Logger;
- public class Log4jTest {
- private static Logger logger = Logger.getLogger(Log4jTest.class);
- public static void main(String[] args) {
- System.out.println("This is log4j test.");
- // 记录debug级别的信息
- logger.debug("This is debug message.");
- // 记录info级别的信息
- logger.info("This is info message.");
- // 记录error级别的信息
- logger.error("This is error message.");
- }
- }
log4j的使用和配制另参见:http://blog.csdn.net/luoweifu/article/details/43638495
3.commons-logging
commons-logging提供的是一个日志(Log)接口(interface),是为那些需要建立在不同环境下使用不同日志架构的组件或库的开发者创建的,其中包括Apache Log4j以及Java log的日志架构。把日志信息抽象成commons-logging的Log接口,并由commons-logging在运行时决定使用哪种日志架构。因为Log4j的强大功能,commons-logging一般会和Log4j一起使用,这几乎成为了Java日志的标准工具。
commons-logging有两个基本的抽象类:Log(基本记录器)和LogFactory(负责创建Log实例)。当commons-logging.jar被加入到CLASSPATH(通常将commons-logging.jar放在web project下的WebContent\WEB-INF\lib目录中)之后,它会合理地猜测你想用的日志工具,然后进行自我设置,用户根本不需要做任何设置。默认的LogFactory是按照下列的步骤去发现并决定那个日志工具将被使用的(按照顺序,寻找过程会在找到第一个工具时中止,这个顺序非常重要):
00001. 寻找当前factory中名叫org.apache.commons.logging.Log配置属性的值
00002. 寻找系统中属性中名叫org.apache.commons.logging.Log的值
00003. 如果应用程序的classpath中有log4j,则使用相关的包装(wrapper)类(Log4JLogger)
00004. 如果应用程序运行在jdk1.4的系统中,使用相关的包装类(Jdk14Logger)
00005. 使用简易日志包装类(SimpleLog)
commons-logging与log4j的配合使用:
项目目录结构:
common-logging.properties:
#use commons-logging default SimpleLog # org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog #use log4j org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JCategoryLog #JDK1.4 Logger #org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger |
代码:
- package lwf.log.test;
- import org.apache.log4j.Logger;
- public class Log4jTest {
- private static Logger logger = Logger.getLogger(Log4jTest.class);
- public static void main(String[] args) {
- System.out.println("This is log4j test.");
- // 记录debug级别的信息
- logger.debug("This is debug message.");
- // 记录info级别的信息
- logger.info("This is info message.");
- // 记录error级别的信息
- logger.error("This is error message.");
- }
- }
参考:
http://www.cnblogs.com/xwdreamer/archive/2011/12/28/2304598.html
http://shift8.iteye.com/blog/1316802
Java中的日志——Java.util.logging、log4j、commons-logging的更多相关文章
- java中的日志打印
java中的日志打印: 日志工具类: #获取日志 INFO:表示获取日志的等级 A1:表示日志存器,可以自定义名称 #===DEBUG INFO log4j.rootLogger=DEBUG,A1,A ...
- Java中数组操作 java.util.Arrays 类常用方法的使用
任何一门编程语言,数组都是最重要和常用的数据结构之一,但不同的语言对数组的构造与处理是不尽相同的. Java中提供了java.util.Arrays 类能方便地操作数组,并且它提供的所有方法都是静态的 ...
- slf4j+log4j在Java中实现日志记录
小Alan今天来跟大家聊聊开发中既简单又常用但必不可少的一样东西,那是什么呢?那就是日志记录,日志输出,日志保存. 后面就统一用日志记录四个字来形容啦. 日志记录是项目的开发中必不可少的一个环节,特别 ...
- Log4j官方文档翻译(四、如何在java中输出日志消息)
我们已经创建来配置文件,本章详细的介绍下如何生成调试信息,并把他们转化成文本文件. 基本的例子 下面就是创建的一个基本的例子: log4j.properties的内容为: log = /usr/hom ...
- java中的日志组件-log4j
1.为什么使用日志组件 Log4J是Apache的一个开放源代码项目,它是一个日志操作包,通过使用Log4J,可以指定日志信息输出的目的地,如控制台.文件.CUI组件.NT的事件记录器:还可以控制每一 ...
- java中开源日志记录工具log4j
日志:除了能记录异常信息,还可以记录程序正常运行时的关键信息. 使用log4j来进行日志文件记录经典步骤: 001.在项目中创建一个lib文件夹,然后将下载好的jar包copy到该文件夹下 002.对 ...
- Java中的日志管理
日志是应用程序运行中不可缺少的一部分,JAVA中有很多已经成熟的方案,尽管记录日志是应用开发中并不可少的功能,在 JDK 的最初版本中并不包含日志记录相关的 API 和实现.相关的 API(java. ...
- Java中的日志框架
日志框架的介绍和使用 常见的日志框架:JUL(Java.util.logging),JCL(jakarta commons logging),SLF4J,jboss-logging,Log4j,Log ...
- java中log日志的使用(完全版)
Commons_logging包 Apache通用日志包 他为Log4JLogger:NoOpLog:LogKitLogger:Jdk14Logger:AvalonLogger提供了一共通用的接口进行 ...
随机推荐
- PC环境搭建——虚拟机配置双网卡
Vmware虚拟机三种网络模式详解 TCP/IP协议四层模型: 应用层 传输层 网络层 物理接口 桥接模式时,主机和虚拟机在同一个网段,之间可以相互访问 NAT模式时,主机和虚拟机不在同一网段,之间通 ...
- 踩坑留印,启动进程遇到报错:/proc/self/fd/9: 2: ulimit: bad number
启动进程,遇到报错: /proc/self/fd/9: 2: ulimit: bad number 分析配置文件内容没有错误. 怀疑可能是文件格式问题,在IDE里面查看,果然是windows格式.ID ...
- To Support High-Density Retina Displays
http://www.sitepoint.com/support-retina-displays/ http://www.leemunroe.com/designing-for-high-resolu ...
- Android Dagger2.0 学习一下
0.前言 个人感觉通过项目学习一些牛逼的框架,效果挺不错的. 1.个人理解 一直觉得Dagger2比较高大上,网上看了很多资料,很多,没有感觉. 然后怀疑智商问题,然后放弃了. 最后因为要做一个项目, ...
- (转)Ruby On Rails 推荐 Gem 列表
作者:尘缘,QQ:130775,来源:http://www.4wei.cn/archives/1002157 PHP的包管理Composer还在刚刚兴起的阶段,Ruby社区已经有很多成熟的Gem了,R ...
- Ruby 基础教程1-6
1.循环实现方法 循环语句 (while;for; loop,until) 循环方法(times,each) 2.for for 变量 in 对象 主体 ...
- 结合BeautifulSoup和hackhttp的爬虫实例
网页页数的改变 headers头不添加
- JMeter常用元器件
测试计划, 是整个工程的根节点, 可以取别名, 并添加注释, 里面的设置是全局变量: 线程组, 是一组线程的集合, 可以取别名, 并添加注释, 里面的设置只对本线程组有效: HTTP请求, 也就是取样 ...
- selenium自动化一点记录
UI自动化 1.webdriver的findElement方法可以查找页面某元素,通常使用方式是通过id和name进行查找 1.By ID根据id进行定位 WebElement element=dri ...
- zookeeper应用:屏障、队列、分布式锁
zookeeper工具类: 获取连接实例:创建节点:获取子节点:设置节点数据:获取节点数据:访问控制等. package org.windwant.zookeeper; import org.apac ...