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提供了一共通用的接口进行 ...
随机推荐
- c语言指针的指针
c语言在函数传递时常常使用如下的形式. void get(int **p) 对于这个形式,我想过为什么不能够使用 *p 作为形参呢.下面我们看一下代码和执行结果 void get(int **p) { ...
- 自定义view实现圆角图片
前两天想实现一个圆角图片的效果,通过网络搜索后找到一些答案.这里自己再记录一下,加深一下自己的认识和知识理解. 实现圆角图片的思路是自定义一个ImageView,然后通过Ondraw()重绘的功能,将 ...
- Java虚拟机(JVM)内存区域
Java虚拟机内存区域分为五部分:程序计数器.Java虚拟机栈.本地方法栈.堆.方法区.其中程序计数器.Java虚拟机栈.本地方法栈属于线程私有内存区,其生命周期与线程相同,随线程的产 ...
- python脚本 mongodb到postgresql
安装 mongo模块 pip install pymongo 安装postgresql 驱动 pip install python-psycopg2 1 # -*- coding: utf-8 -* ...
- JS dataTables
原文地址: http://www.cnblogs.com/haogj/archive/2011/03/04/1971328.html 数据来源有四种: 1. 网页DOM对象 $(document) ...
- 惊喜Skr人,Istio的创始人Shriram Rajagopalan手把手教你如何使用Istio
Shriram与来自Google.Lyft.IBM和其他公司的社区贡献者们一起并肩作战,积极地向Istio和Envoy项目作贡献.同时,Shriram是IBM的Amalgam8项目的创始成员之一.目前 ...
- Windows运行机理——窗口句柄和消息
Windows运行机理这系列文章都是来至于<零基础学Qt4编程>——吴迪,个人觉得写得很好,所以进行了搬运和个人加工 现在我们将消息与句柄联系起来.假如有一个窗口,且拥有该窗口的一个句柄( ...
- Git 新建文件并提交
1.创建一个readme.txt. cd /home/cyp/learngit touch readme.txt vim readme.txt 编写内容, wq 保存推出 2.提交步骤 2.1 gi ...
- 基于 CPython 解释器,为你深度解析为什么Python中整型不会溢出
前言 本次分析基于 CPython 解释器,python3.x版本 在python2时代,整型有 int 类型和 long 长整型,长整型不存在溢出问题,即可以存放任意大小的整数.在python3后, ...
- MySQL三方面优化
第一方面:30种mysql优化sql语句查询的方法1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用 ...