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

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

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

参考资料#

作者:GreyZeng

出处:https://www.cnblogs.com/greyzeng/articles/4547645.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

你可以在这里自定义其他内容

posted @   Grey Zeng  阅读(351)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu