1、什么是Log4j
Log4j 是Apache为Java提供的日志管理工具。他与System.out.println()的作用相似,用来跟踪、调试、维护程序。
为了你快速理解Log4j的作用,我们用下面的代码说明Log4j的作用。
在没有这个插件以前,我们为了调试程序,总是需要在程序使用System.out.println()来输出一些信息。例如下面的代码:
// 获取UserService
UserService userService = UserServiceFactory.getUserService();
if(userService == null) {
System.out.println("错误:userService没有获取到!");
return;
}
// 获取要查询的User对象id
String uid = request.getParameter("uid");
int id;
try {
id = Integer.parseInt(uid);
} catch(NumberFormatException e) {
System.out.println("错误:无法将uid转换成int类型!");
throw e;
}
// 查询User
User user = userService.load(id);
System.out.println("信息:已查询到User对象");
user.setPassword("zhangSan");
System.out.println("信息:修改user的密码");
userService.save(user);
System.out.println("信息:保存user信息");
上面例子中所有的输出语句都是用来调试程序的,相信你的代码中也经常会出现这样的调试代码吧?这些调试代码必须在项目完成后删除。你想一想,一行一行的删除会不会忘记几行没有删除呢?
使用Log4j来打印这些测试代码,然后通过配置文件就能统一管理这些日志信息了!我们可以在配置文件中关闭所有日志,也可以在配置文件中打开所有日志,也可以打开某个级别的日志。甚至还可以管理日志出现的格式(是否加上日期和时间),以及日志输出的目标(是否为控制台,是否为文件)。
2、Log4j核心概念
Log4j中有三大组件:日志器(Logger)、日志输出目标(Appender)、格式化器(Layout)
1、Logger:用来输出日志消息的类,它可以输出不同级别的消息,例如错误消息、警告消息等;
2、Appender;通常我们希望日志输出到文件中,以及控制台,也可能希望日志输出数据库,该类就表示一个输出的目标;
3、Layout:对输出的消息进行格式化,例如在消息中添加日期,以及级别等。
3、日志级别
在Log4j中日志消息分为五个级别,级别由高到低排列如下:
FATAL:重大错误,例如系统崩溃;
ERROR:错误,例如某模块瘫痪;
WARN:警告,程序的隐患,如果不处理,将来可能就是错误;
INFO:信息,可以用来查看程序执行的流程;
DEBUG:调试,用来调试程序的bug。
我们可以使用日志器输出这五种不同的日志,然后通过设置日志器的级别来控制输出的结果。来看下面的代码:
@Test
public void test() {
log.setLevel(Level.ERROR)//设置日志级别为ERROR
log.debug("hello log4j debug!");
log.info("hello log4j info!");
log.warn("hello log4j warn!");
log.error("hello log4j! error");
log.fatal("hello log4j fatal!"); //输出成功
}
上面代码中,只有error()和fatal()两个方法的输出会完成,其他级别的输出都不会完成。因为设置日志器的级别为Level.ERROR后,只有高于ERROR级别的日志才能输出。
2、日志器名称
在创建日志器时,需要给日志器指定一个名称:Logger log = Logger.getLogger(“hello”);
日志器的名称不只是一个名称而已,日志器的名称说明了日志器之间的父子关系。子日志器会继承父日志器的Appender和Level。
日志器的父子关系是通过日志器的名称来决定的,例如名称为com.chj的日志器是com.chj.logger的日志器的爸爸。com.chj.logger会继承com.chj的Appender以及Level。
@Test
public void fun() {
Logger log = Logger.getLogger("com.luowg");
Appender appender = new ConsoleAppender(new SimpleLayout());
log.addAppender(appender);
log.setLevel(Level.ERROR);//创建名称为cn.chj的日志器
Logger log1 = Logger.getLogger("com.chj.logger");//创建名称为cn.chj.lgger的日志器,它继承名为cn.itcast的格式化器
log1.debug("看不见!");
}
通常我们创建日志器都是使用当前类的名称来创建:
Logger log = Logger.getLogger(Demo.class.getName());
这样我们可以通过配置父日志器来改变日志器的Appender和Level。