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提供了一共通用的接口进行 ...
随机推荐
- OracleLinux上安装Oracle11g图解
磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL杂记页 回到顶级页面:PostgreSQL索引页 [作者 高健@博客园 luckyjackgao@gmail. ...
- Ruby学习系列一,基本认识
安装Ruby后,打开命令行,先来看下Ruby的版本. ruby -v ,如果看到类似 ruby 1.9.3p392.... ,说明我们的Ruby安装成功了. 然后我们输入 irb ,进入Ruby的交互 ...
- 使数据可供ArcGIS Server访问
内容来自ESRI官方文档(点击访问),简单总结如下: 1 ArcGIS Server用于发布服务的数据必须存储在服务器可以访问的位置: 2 这样的位置有三种类型: 本地路径:将数据本地存储在每台 Ar ...
- unity3d 计时功能舒爽解决方案
上次也写了一篇计时功能的博客 今天这篇文章和上次的文章实现思路不一样,结果一样 上篇文章地址:http://www.cnblogs.com/shenggege/p/4251123.html 思路决定一 ...
- 前台时间格式 2019-03-09T16:00:00.000Z
问题描述: 本想在前台把字符串格式的日期(2019-03-09)转换成日期格式(2019-03-09 00:00:00),但当把这个参数传到后台去后却变成了2019-03-08T16:00:00.00 ...
- MySQL☞substr函数
substr函数:截取字符串 格式如下: select substr(参数1,参数2,参数3) from 表名 参数1:列名/字符串 参数2:起始位置,如果为正数,就表示从正数的位置往下截取字符 ...
- java后台接受web前台传递的数组参数
前台发送:&warning_type[]=1,2 &warning_type=1,2 后台接收:(@RequestParam(value = "param[]") ...
- Spring 配置请求过滤器,编码格式设为UTF-8,避免中文乱码
<!-- 配置请求过滤器,编码格式设为UTF-8,避免中文乱码--> <filter> <filter-name>springUtf8Encoding</fi ...
- C if 判断 else 否则
#include <stdio.h> int main(int argc, char **argv) { //新建三个变量进行比较 int a,b,c; //输入三个变量的值scanf(& ...
- JAVA中 "\" 和 "/" 的区别
1.在java中路径一般用”/” 2.linux.unix中的路径一般用”/” 3.windows中的路径一般用”\” 所以在java中写windows路径一般用”/”,或用“\”将”\”转义一下(& ...