• 【助教】浅析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
    

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

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

    参考资料

  • 相关阅读:
    AtomicReference与volatile的区别
    深度剖析ConcurrentHashMap(转)
    ConcurrentHashMap原理分析
    Java Stack源码分析
    Fail-Fast机制详解
    TreeSet源码分析
    状态(State)模式
    原型(Prototype)模式
    职责连模式
    观察者模式(Observer)
  • 原文地址:https://www.cnblogs.com/greyzeng/p/4547645.html
Copyright © 2020-2023  润新知