详述Log4j

33 篇文章 0 订阅

Log4j

Apache的一个开源项目,帮助开发人员进行日志输出管理的API类库。

log4j= log for java 一个java平台的日志系统,类似的还有commons-loggin,slf4j,都是日志工具。

 为什么使用Log4j

      通过使用Log4j,可以控制日志信息格式及其输送目的地(控制台、文件、数据库等),方便的对项目中的日志进行处理——控制日志信息输送的目的地(控制台、文件、GUI组件甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等)、控制每一条日志的输出格式(HTMLLayout布局格式、PatternLayout布局格式、SimpleLayout布局格式或TTCCLayout)、控制所输出日志信息的级别(DEBUG级别、INFO级别、WARN级别、ERROR级别或FATAL级别)等,更加细致地控制日志的生成过程。。使用log4j方便后期查找系统运行期间出现的问题,进而便于维护系统。

以不使用log4j为例:

public static void main(String[] args) {
	while (true) {
		try {
			System.out.println(1/0);	
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

运行上面代码,控制台会不断打印错误信息。但是由于JVM内存是有限的,不可能将所有的错误信息都打印到控制台上,当错误信息超出内存的时候,新产生的错误信息会覆盖掉之前的错误信息,导致程序员不能够看到完整的错误信息。使用Log4j就可以很好的处理该类似情况。

 配置Log4j的步骤

第一步:导入log4j-1.2.15.jar依赖包;

第二步:在src根目录下创建名为log4j.properties的文件,文件内容如下:

Log4j配置文件详解:https://blog.csdn.net/gaohuanjie/article/details/44077551

 第三步:src目录创建Test类,代码如下:

import org.apache.log4j.Logger;
 
public class Test {
 
	private static final Logger logger = Logger.getLogger(Test.class);
 
	public static void main(String[] args) {
		try {
			Class.forName("ErrorClassName");
		} catch (ClassNotFoundException e) {
			logger.debug(e.getMessage(),e);//详细日报信息
			logger.info(e.getMessage(),e);//详细日报信息
			logger.warn(e.getMessage());//简单日报信息
			logger.error(e.getMessage());//简单日报信息
		}
          }
}

运行Test类方法,打开D盘根目录中log.log文件可以看到相应的日志信息,此时的日志信息都会显示出来。Log4j常用日志级别从高到低依次为:ERROR、WARN、INFO和DEBUG,由于上例所设置的Log4j日志级别为DEBUG,所以ERROR、WARN和INFO级别的日志信息也会显示出来。

 将上述没使用log4j的例子改成使用log4j技术的

代码如下:

import org.apache.log4j.Logger;

public class Log {

	public static void main(String[] args) {

		Logger logger = Logger.getLogger(Log.class);
		int i = 0;
		while (true) {
			try {
				System.out.println(1 / 0);
			} catch (Exception e) {
				ArithmeticException a = (ArithmeticException) e;
				logger.debug(a.getMessage(), a);
				System.out.println(i);
				a.printStackTrace();
			}
			i++;
		}
	}
}

 在控制台上打印的第一个错误信息时i已经是35316了。再次说明了不可能将所有的错误信息都打印到控制台上,当错误信息超出内存的时候,新产生的错误信息会覆盖掉之前的错误信息

 然而根据上述的操作我们去D盘根目录中log.log文件可以看到相应的日志信息,此时的日志信息都会显示出来。

间歇性产生新日志文件 

上例配置文件是将所有的日志信息都收集到了一个文件中,那么随着时间的推移,该文件会越来越大,内容也会越来越多,这不利于后期对日志文件进行分析,为了解决该问题可以这样配置log4j.properties文件:

# DEBUG设置输出日志级别,由于为DEBUG,所以ERROR、WARN和INFO 级别日志信息也会显示出来
log4j.rootLogger=DEBUG,RollingFile
#每天产生一个日志文件(RollingFile)  
log4j.appender.RollingFile=org.apache.log4j.DailyRollingFileAppender
#当天的日志文件全路径
log4j.appender.RollingFile.File=d:/logs/sirius.log
#服务器启动日志是追加,false:服务器启动后会生成日志文件把老的覆盖掉
log4j.appender.RollingFile.Append=true
#日志文件格式  
log4j.appender.RollingFile.layout=org.apache.log4j.PatternLayout  
log4j.appender.RollingFile.layout.ConversionPattern=%d [%t] %-5p %-40.40c %X{traceId}-%m%n
log4j.appender.RollingFile.Threshold=DEBUG
#设置每天生成一个文件名后添加的名称,备份名称:sirius.log.年月日时分.log
log4j.appender.RollingFile.DatePattern='.'yyyy-MM-dd-HH-mm'.log'

DatePattern选项的有效值为: '.'yyyy-MM,对应monthly(每月) '.'yyyy-ww,对应weekly(每周) '.'yyyy-MM-dd,对应daily(每天) '.'yyyy-MM-dd-a,对应half-daily(每半天) '.'yyyy-MM-dd-HH,对应hourly(每小时) '.'yyyy-MM-dd-HH-mm,对应minutely(每分钟) DatePattern中不用处理的文字要放到单引号(')中,如上面的(.)。

自定义properties的文件 

Log4j默认使用src根目录中名为log4j.properties的文件,实际开发中有可能需要使用特定目录中的特定名字的properties文件

其中,config包内log.properties文件保存了Log4j相关配置信息,代码如下:

import java.net.URL;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

public class Test {

	static {
		// 获取src目录config包中log.properties文件对应的URL对象
		URL url = Test.class.getResource("/config/log.properties");
		PropertyConfigurator.configure(url);
	}

	static Logger logger = Logger.getLogger(Test.class);

	public static void main(String[] args) {
		try {
			System.out.println(1 / 0);
		} catch (Exception e) {
			logger.debug(e.getMessage(), e);
		}
	}
}

开发中不止一个Java类需要将某些日志信息写入指定位置,此时每个类中都会重复性地写入如下代码:

static {
	// 获取src目录config包中log.properties文件对应的URL对象
	URL url = Test.class.getResource("/config/log.properties");
	PropertyConfigurator.configure(url);
}

为了尽可能重用代码,可以将该部分代码写入到一个Java类中(如BaseLog4j.java),需要输出日志的类只需继承该类即可,如下代码:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值