Loading

【助教】浅析Log4j的使用

有不少童鞋私信我一些在写代码时候遇到的问题,但是无法定位问题出在哪里,也没有日志记录,实际上,写日志是开发项目过程中很重要的一个环节,很多问题都可以从日志中找到根源,从而定位到出错位置,为解决问题提供了基础,同时,对于一些关键性的操作,比如:

  • 银行转账
  • 机票预订
    ...
    等关键操作记录下日志,方便查看相关信息。

下面,介绍一个日志框架log4j的使用。

下载

http://logging.apache.org/log4j/1.2/download.html

我下的版本是:log4j-1.2.17.zip

下载完成后,解压,导入log4j-1.2.17.jar到项目中

创建Logger对象

T.java

package com.hui.demo;

import org.apache.log4j.Logger;

public class T {
	public static final Logger logger = Logger.getLogger(T.class);
	
	public void test() {
		
	}
}

为日志设定不同的级别

日志级别:debug < info < warn < error < fatal
也就是说,如果设置日志为某个级别,则日志记录大于等于这个级别类型的日志,例如:设置日志级别为warn,最后日志中会显示示:warn,error,fatal类别的日志。

T.java

package com.hui.demo;

import org.apache.log4j.Logger;

public class T {
	public static final Logger logger = Logger.getLogger(T.class);
	public void test() {
		logger.debug("这是debug类别的日志");
		logger.info("这是info类别的日志");
		logger.warn("这是warn类别的日志");
		logger.error("这是error类别的日志");
		logger.fatal("这是fatal类别的日志");
	}
}

编写日志的配置文件

在项目的src目录下建一个文件:log4j.properties

#日志的输出方式:ConsoleAppender为控制台输出
#另外log4j还提供其他的输出方式,例如:文件输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#日志的布局设置,参考log4j API
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#日志的格式设置
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
#rootLogger表示根目录下所有类的日志都打印出来
#DEBUG为日志级别,表示DEBUG以及大于DEBUG级别的日志全部输出
log4j.rootLogger=DEBUG,stdout

测试

public class TestLog4j {
	public static void main(String[] args) {
		T t = new T();
		t.test();
	}
}

运行,可以看到控制台打印出日志信息。

2015-06-18 01:25:23,885 [main] DEBUG com.hui.demo.T - 这是debug类别的日志
2015-06-18 01:25:23,885 [main] INFO  com.hui.demo.T - 这是info类别的日志
2015-06-18 01:25:23,885 [main] WARN  com.hui.demo.T - 这是warn类别的日志
2015-06-18 01:25:23,885 [main] ERROR com.hui.demo.T - 这是error类别的日志
2015-06-18 01:25:23,885 [main] FATAL com.hui.demo.T - 这是fatal类别的日志

以上是一个把日志打印在控制台的例子。
另外一个例子

import org.apache.log4j.Logger;

public class T {
    public static final Logger logger = Logger.getLogger(T.class);
    public int divide(int num1, int num2) {
        int result = 0;
        logger.debug("num1 = "+num1 + " num2 = "+ num2);
        try {
            result = num1/num2;
            logger.debug("result is :"+ result);
        } catch (Exception e) {
            logger.error("出错了:"+e.getMessage());
        }
        return result;
    }
}

运行测试类

public class TestLog4j {
    public static void main(String[] args) {
        int a = 4;
        int b = 2;
        T t = new T();
        t.divide(4, 0);
    }
}

运行,打印出日志信息:

2015-06-18 01:53:24,855 [main] DEBUG com.hui.demo.T - num1 = 4 num2 = 0
2015-06-18 01:53:24,855 [main] ERROR com.hui.demo.T - 出错了:/ by zero

看到日志,问题就很清晰的定位到了。童鞋们可以考虑以下拓展:

  • 把日志打印到文件。
  • 日志文件 按每天/按照固定大小 生成一份新的。
  • 将日志框架应用到你们的项目中,在关键代码中加记录日志的操作。

参考资料

posted @ 2015-06-02 21:03  Grey Zeng  阅读(347)  评论(0编辑  收藏  举报