一、背景前沿
项目中经常性的会遇到有日志输出的情况,例如:system.out,或者是用于调试,或者用于记录系统的运行状态。存在这么一种需求,首先,希望日志的输出地除了控制台consol,还希望能够直接写入到文件中,以及可以自动的管理日志文件的大小;同时,还可以设置当前日志的严重级别,并根据严重级别控制输出的类别;最后一点,就是性能的考虑,要做到日志的输出不能够影响系统的总体性能。Log4j便能满足这么一种需求,它是开源的用于日志输出的组件,用于替代传统的system.out等日志输出。
二、log4j概述
1、Log4j的官网地址:http://logging.apache.org
2、Log4j类图:
简单介绍类图结构:
Logger,日志写出器,程序员使用的最直接的类,用于日志输出。
Appender,日志目的地,用于控制日志的输出地,例如:consoleappender输出到控制台,fileappernder输出到文件中。
Layout:日志格式器,用于控制输出日志的格式,样式等。
至于各个类提供的具体方法,可以参考附件中的log4japi文档,或者参考同目录下的log4j学习笔记。
三、log4j使用说明
1、 到官网下载log4jxxx.jar,并放到项目中的lib下。
2、 添加配置文件(log4j.properties,或者log4j.xml),可以从jar包将例子配置文件复制出来,再根据实际需要修改。
3、 在需要添加日志输出的类中,追加logger定义,在相应的方法中添加合适级别的输出。
4、 请看下面一段示例代码:
public class Log4jTest {
public static void main(String argv[]) {
// Create a logger by the name of class Log4jTest.
Logger logger = Logger.getLogger(Log4jTest.class);
// Use the default configuration.
BasicConfigurator.configure();
// Set the logger level to Level.INFO
logger.setLevel(Level.INFO);
// This request will be disabled since Level.DEBUG < Level.INFO.
logger.debug("This is debug.");
// These requests will be enabled.
logger.info("This is an info.");
logger.warn("This is a warning.");
logger.error("This is an error.");
logger.fatal("This is a fatal error.");
return;
}
}
5、项目中log4j对象之间的层次关系
如上所述,log4j用于项目中的日志输出;在需要的时候,在指定的类中定义logger对象,然后在需要日志输出的地方调用logger.debug/info/error/…(“日志内容”),即可。即,需要为不同的类定义各自的logger对象,项目中的类在packe级别存在层次关系,那么同样的logger对象也存在着层次关系,例如:x.y是x.y.z的上一层父亲。
首先,每个项目中都有一个且唯一的一个root logger(根logger对象),所有的logger类都继承该根logger,所谓继承指的是继承root的配置项。定义log4j.properties以及log4j.xml,就是对root logger进行的配置。
其次,可以通过方法setAdditivity()设置每个logger是否继承父亲的配置。默认情况下,是true,继承父亲配置。下面各个子logger也可以根据自己的需要,通过编程的方式(调用logger的API)实现配置。
最后,logger对象之间虽然存在着父子关系,但是对其创建顺序没有影响。可以先创建子logger,再创建父logger,log4j会自动的维护关系树。
四、log4j具体配置文件,配置项说明
1、配置文件简述
Log4j有两个配置文件,一个是log4j.properties,一个是log4j.xml,两个配置文件都是用于配置根logger对象的(root logger)。两个配置文件只是格式不一样,但是配置的内容都是一样的,包含3个配置:logger级别(level),logger的输出目的地(appender),logger的输出样式(layout)。
其中,由于log4j的记载过程,决定了log4j.xml优先级要高于log4j. properties配置文件。下面将简述其加载初始化过程。
如果用户在static初始化块,显示编程方式加载了用户自定义的配置文件(可以是任意名字的.properties,也可以是任意名字的.xml)文件,XXXConfigurator.configure(配置文件名字),那么将加载用户指定的该配置文件。
如果上述加载成功,则不会再去读取系统其他配置文件。如果上述加载失败,则会先在类路径下寻找log4j.xml文件,加载处理。
如果上述加载成功,则不会再去读取系统的其他配置文件。如果上述加载失败,则会在类路径下寻找log4j.properties文件,加载处理。
2、配置API说明
root logger的配置可以通过上述配置文件的方式实现。
Root logger,普通级别logger配置,也可以通过调用API方式实现,下面贴出一个简单的例子:
public class testlog4jdft {
public static void main(String[] args) {
//创建一个logger日志写出器对象
Logger logger = Logger.getLogger(testlog4jdft. class );
//启用默认配置
// BasicConfigurator.configure();
// DOMConfigurator.conf
// PropertyConfigurator.configure(configFilename)
//设置日志级别
// logger.setLevel(Level.TRACE);
//为logger设置appender:日志目的地
// ConsoleAppender ca=new ConsoleAppender(new PatternLayout());
// logger.addAppender(ca);
//以不同的级别输出
logger.debug( "ququ---- debug " );
logger.trace("ququ----trace");
System.out.println("--------------------");
logger.error( " ququ----error " );
logger.fatal("ququ-----fatal");
logger.warn("ququ------warning");
logger.info("ququ=========info");
}
}
以上说明,logger的配置既可以通过配置文件方式,也可以通过编程的方式实现。
同时,如果采用配置文件方式,配置文件的加载,如果显示指定了配置文件名称,那加载所指定的;否则,默认优先加载xml。即:用户显示指定>log4j.xml>log4j.properties。
3、配置项说明
可以参考同目录下的,log4j配置详解,或者log4j学习笔记。
五、编程习惯常见用法
Ø 让每个类都拥有一个private static的Logger对象,用来输出该类中的全部日志信息
Ø 使用xml文件来完成对log4j环境的配置。在项目的main class中的静态初始化块里放log4j环境的配置代码。用XXXConfigurator.configure(配置文件名字)方法加载用户指定的配置文件。注意:在一个项目中,log4j环境只需要被配置一次,而不是在每个使用了logger的类里都需要调用一次 。子logger通常继承root的配置。
Ø 用MyClass.class作为参数创建该类的静态Logger对象