log4j additivity解说

      Log4j 为记录Java应用中的输出信息,包括调试信息(DEBUG),提示信息(ERROR),错误信息(ERROR)等。下面是一个Log4j配置文件的Appender配置:

LOG_DIR=c:\logs

### direct log messages to platform ###
log4j.appender.platform=org.apache.log4j.ConsoleAppender
log4j.appender.platform.Target=System.out
log4j.appender.platform.layout=org.apache.log4j.PatternLayout
log4j.appender.platform.layout.ConversionPattern=[%d{ISO8601}] :%5p %c{1}:%L - %m%n

log4j.appender.platform1=org.apache.log4j.RollingFileAppender
log4j.appender.platform1.File=${LOG_DIR}/trace.log
log4j.appender.platform1.MaxBackupIndex=100
log4j.appender.platform1.MaxFileSize=5000000
log4j.appender.platform1.layout=org.apache.log4j.PatternLayout
log4j.appender.platform1.layout.ConversionPattern=[%d{ISO8601}] :%-5p %-x %X{user} %n     %m%n

log4j.appender.platform2=org.apache.log4j.RollingFileAppender
log4j.appender.platform2.File=${LOG_DIR}/trace2.log
log4j.appender.platform2.MaxBackupIndex=100
log4j.appender.platform2.MaxFileSize=5000000
log4j.appender.platform2.layout=org.apache.log4j.PatternLayout
log4j.appender.platform2.layout.ConversionPattern=[%d{ISO8601}] :%-5p %-x %X{user} %n     %m%n

log4j.appender.platform3=org.apache.log4j.RollingFileAppender
log4j.appender.platform3.File=${LOG_DIR}/trace3.log
log4j.appender.platform3.MaxBackupIndex=100
log4j.appender.platform3.MaxFileSize=5000000
log4j.appender.platform3.layout=org.apache.log4j.PatternLayout
log4j.appender.platform3.layout.ConversionPattern=[%d{ISO8601}] :%-5p %-x %X{user} %n     %m%n


一、Appender 与 additivity

      1、Log4j Appender则可理解为定义一个输出方式,例如可以输出到控制台,也可以输出到文件(固定周期,每天使用一个日志文件记录;固定大小,超过指定大小则记录到一个新问价中),还可以输出到数据库,甚至可以远程输出到一个日志接口程序中进行记录。

      Appender配置好以后,记录哪个程序包运行时的日志呢?答案是通过log4j.logger来指定,log4j.logger后带的包名即为Appender要记录的程序包范围,如下面的例子:

                     log4j.logger.com.sgcc=debug, platform1

      platform1是事先定义好的一个Appender,log4j.logger.com.sgcc表示对程序包com.sgcc中的程序使用Appender(名为:platform1)。

下面是一个Appender platformat1的配置:

log4j.appender.platform1=org.apache.log4j.RollingFileAppender
log4j.appender.platform1.File=${LOG_DIR}/trace.log
log4j.appender.platform1.MaxBackupIndex=100
log4j.appender.platform1.MaxFileSize=5000000
log4j.appender.platform1.layout=org.apache.log4j.PatternLayout
log4j.appender.platform1.layout.ConversionPattern=[%d{ISO8601}] :%-5p %-x %X{user} %n     %m%n

       一个程序包可以指定多个Appender也就是说,一个程序包的日志可以输出到多个不同的目的地中去例如:

                 log4j.logger.com.sgcc=debug, platform1,platform2,platform3

使用该配置,程序包com.sgcc的日志可以输出到platform1,platform2,platform3三个Appender中。

       2、Log4j additivity则使指是否输出到顶层包定义的Appender中,如com.pa中定义了一个Appender A1,而com.pa.pb中又定义了一个Appender A2,则程序运行时,com.pa.pb中的类若有日志输出,则既会输出到A1中,也会输出到A2中。

    有些时候,A2的处理可能比较专职化,不希望其日志掺杂到全局或高层的日志记录中,则可以使用additivity功能来实现。

    (1)例子一

      下面看一个例子,以上面的Log4j Appender配置为基础,进行包的Appender配置和additivity配置:

           log4j.logger.com.sgcc=debug, platform1
           log4j.additivity.com.sgcc.test=false
           log4j.logger.com.sgcc.test.p1=debug, platform2
           log4j.logger.com.sgcc.test.p2=debug, platform3

      应用程序顶层包com.sgcc输出调试级别的信息,使用的Appender为platform1,日志输出到文件trace.log。

      com.sgcc.test.p1包输出调试级别的信息,使用Appender为platform2,日志输出到文件trace2.log。

      com.sgcc.test.p2包输出调试级别的信息,使用Appender为platform3,日志输出到文件trace3.log。

      测试文件Log4jTest1.java:

package com.sgcc.test;

import org.apache.log4j.Logger;

import com.sgcc.test.p1.Log4jTest1;
import com.sgcc.test.p2.Log4jTest2;


public class Log4jTest {
	static Logger log = Logger.getLogger(Log4jTest.class);
	
	public void logtest(){
		log.debug("Log4jTest printed the log.");
		
		new Log4jTest1().logtest();
		
		new Log4jTest2().logtest();
	}
	
	public static void main(String[] args) {
		Log4jInit.initLog4j();
		Log4jTest log4jtest = new Log4jTest();
		log4jtest.logtest();
	}
}

Log4jTest1.java:

package com.sgcc.test.p1;

import org.apache.log4j.Logger;

public class Log4jTest1 {
	static Logger log = Logger.getLogger(Log4jTest1.class);
	
	public void logtest(){
		log.debug("Log4jTest1 printed the log.");
		System.out.println("sysout:Log4jTest1 printed the log.");
	}
}

Log4jTest2.java:

package com.sgcc.test.p2;

import org.apache.log4j.Logger;


public class Log4jTest2 {
	static Logger log = Logger.getLogger(Log4jTest2.class);
	
	public void logtest(){
		log.debug("Log4jTest2 printed the log.");
	}
}


      若设置com.sgcc.test.p1的上一层包com.sgcc.test的additivity属性为false,请问:Log4jTest,Log4jTest1,Log4jTest2的日志分别会输出到哪些文件中?

      答案是:  

trace.log Log4jTest,Log4jTest1,Log4jTest2
trace2.log
Log4jTest1
trace3.log
Log4jTest2

      这里可以看出,log4j.logger.additivicom.sgcc.test=false 并没有阻止Log4jTest1的日志进入顶层包Appender的输出文件trace.log中,因为com.sgcc.test包没有定义Appender,com.sgcc.test的additivity属性并不能延伸到子层(p1, p2)的包中。

   (2)例子二

     仍以例子的数据和程序为基础,修改配置为:

           log4j.logger.com.sgcc=debug, platform1
           log4j.additivity.com.sgcc.test.p2=false
           log4j.logger.com.sgcc.test.p1=debug, platform2
           log4j.logger.com.sgcc.test.p2=debug, platform3

      此时,Log4jTest,Log4jTest1,Log4jTest2的日志分别会输出到哪些文件中?

      答案是:

trace.log Log4jTest,Log4jTest1
trace2.log
Log4jTest1
trace3.log
Log4jTest2
      因为Appender log4j.logger.com.sgcc.test.p2 的additivity属性被设置为false,顶层或父层的appender将不再记录程序包com.sgcc.test.p2中的程序输出的日志。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值