log4j 2
log4j 学习(二)
前面学习了log4j的Logger对象的使用,算是完成了学习的三分之一吧,log4j还有两个很重要的对象,就是学习(一)中所说的Appenders和Layouts。
Appender,从字面上理解是“追加者”、“输出器”的意思,也即是说日志输出的目的地。log4j的Appenders比较多,可以是控制台(ConsoleAppender)、文件(FileAppender)、SWING组建、远程Socket服务器(SocketAppender)、JMS(JMSAppender)、NT Event Loggers(NTEventLogAppender)、远程Unix后台程序。我们比较关心的是控制台和文件,这是我们用的最多的。每一个logger对象都必须有一个或多个appender,如果没有的话则会报错:
log4j:WARN No appenders could be found for logger (loggername).
log4j:WARN Please initialize the log4j system properly.
通过以下方法我们可以为logger对象定义和添加一个appender:
// 定义一个日志文件输出地,并添加到logger对象上去 Appender a1 = new FileAppender(new SimpleLayout(),"a1.log"); logger.addAppender(a1);
OK,设置了ConsoleAppender的logger打印的日志会输出到控制台,设置了FileAppender则会被输出到文件。这里要学习一下Logger的另一个重要的属性:additivity(传递性)。这个属性也是相对与父子logger对象来说的,且它是针对logger的appender属性。何为父子在学习(一)中已经说过了,下面我们来看一个例子:
Logger logger = Logger.getLogger(AppenderTest.class); Logger root = Logger.getRootLogger(); Appender a1 = new FileAppender(new SimpleLayout(),"a1.log"); Appender a2 = new FileAppender(new SimpleLayout(),"a2.log"); root.addAppender(a1); logger.addAppender(a2); logger.info("logger is info"); logger.debug("logger is debug");
在这个例子中,创建了两个FileAppender对象a1和a2,分别被设置到root和logger中,然后logger打印一些日志。这会导致什么结果呢?系统会为我们创建2个文件,a1.log和a2.log,里面记录有如下内容:
INFO - logger is info
DEBUG - logger is debug
为什么会这样?明明只有logger打印了日志而root并没有打印日志啊!就是additivity在作怪。log4j规定,appender是具有传递性的,子类appender打印的日志默认会传递到父类的appender中,如果不想发生这种传递关系,那么就将logger对象的additivity设置为false。即:
logger.setAdditivity(false);
OK,了解了appender对象之后,我们该了解Layout了。Layout,顾名思义-版面、布局,是指日志的输出格式。log4j包含有SimpleLayout、PatternLayout、XMLLayout、DataLayout、HTMLLayout这几种,用的最多的是PatternLayout,因为它可以根据模式非常灵活的配置输出的格式。那么,让我们来重点了解一下PatternLayout。PatternLayout有一个会话模式(ConversionPattern),它其实是一个字符串,匹配一系列规则,以“%”加上特定字符代表相应的含义,还可以随意添加自己想要的字符。举例如下:
PatternLayout layout = new PatternLayout(); layout.setConversionPattern("%5p %c - %m%n"); Appender appd = new ConsoleAppender(layout); logger.addAppender(appd); logger.info("logger is info"); logger.debug("logger is debug");
输出如下:
INFO log.AppenderTest - logger is info
DEBUG log.AppenderTest - logger is debug
这是"%5p %c %m%n"这个模式在起作用,其中(+)5表示显示靠右(如果是负的则显示在左边),至少占5个字符,p表示优先级,c表示类路径(含包名),“ - ”就是一个普通字符,m表示输出的消息(message),n表示换行。常用的格式有:
%m 输出代码中指定的消息 %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL %r 输出自应用启动到输出该log信息耗费的毫秒数 %c 输出所属的类目,通常就是所在类的全名 %t 输出产生该日志事件的线程名 %n 输出一个回车换行符 %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921 %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。 %F 日志发生的文件名,不含包名,比如XXX.java
OK,Layout也学得差不多了,下次该学习log4j的另一个重点---配置。