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的另一个重点---配置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值