apache通用日志包说明

小弟近在研究日志处理,写下体会,供大家作一下参考:

先来看一段代码:

package com.syp.log;

import java.util.Enumeration;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class Test {
	static Log log = LogFactory.getLog(Test.class);

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		log.info("这里在info里的");
		System.out.println(log.getClass().getName());
                }

}

 它的输出结果如下

	 org.apache.commons.logging.impl.Jdk14Logger
	 2008-11-4 21:15:04 com.syp.log.Test main
	 信息: 这里在info里的

 

为什么这里的log对象是org.apache.commons.logging.impl.Jdk14Logger的实例呢?
   原因在于Log只是通用日志包下的一个接口而已
   在通用日志包中已有Jdk14Logger,Log4jLogger,LogKitLog,NoOpLogger,SimpleLog实现了Log接口
   LogFactory是一个抽象类,public class LogFactoryImpl extends LogFactory
   这个实现类,在LogFactory中的getLog(Class)这个方法,只能过多个判断来获得LogFactory的
   而有这样一段代码:
   public static final String FACTORY_DEFAULT =
   "org.apache.commons.logging.impl.LogFactoryImpl";
   if (factory == null) {
   factory = newFactory(FACTORY_DEFAULT,
   LogFactory.class.getClassLoader());
   }
  
   if (factory != null) {
      
   cacheFactory(contextClassLoader, factory);
  
   if( props!=null ) {
   Enumeration names = props.propertyNames();
   while (names.hasMoreElements()) {
   String name = (String) names.nextElement();
   String value = props.getProperty(name);
   factory.setAttribute(name, value);
   }
   }
   }
  
   return factory;

   当获得了logFactoryImpl实例后可以用 public Log getInstance(String
   name)这个方法得到Log实例,而我们上面得到的Log为
   org.apache.commons.logging.impl.Jdk14Logger,就是在这一步得到的,下面我们看看它是怎么得到的:
   protected String getLogClassName() {

   Return the previously identified class name (if any)
   if (logClassName != null) {
   return logClassName;
   }
  
   logClassName = (String) getAttribute(LOG_PROPERTY);
  
   if (logClassName == null) { // @deprecated
   logClassName = (String) getAttribute(LOG_PROPERTY_OLD);
   }
  
   if (logClassName == null) {
   try {
   logClassName = System.getProperty(LOG_PROPERTY);
   } catch (SecurityException e) {
   ;
   }
   }
  
   if (logClassName == null) { // @deprecated
   try {
   logClassName = System.getProperty(LOG_PROPERTY_OLD);
   } catch (SecurityException e) {
   ;
   }
   }

   当在一定的范围内找不到logClassName,就会通过下以方法来获得logClassName,
   第一个是获得apache的log4j的LogClassName,但因为工程中没有log4j的jar包,classpath里没有org.apache.commons.logging.impl.Log4JLogger
   无法加载该Log,所以logClassName==null
   而后,就会得到Jdk14Logger的logclassname,所以在上面输出的是org.apache.commons.logging.impl.Jdk14Logger
   但是当我们把log4j的jar包加到工作的classpath下,得到的输出结果就会不一样了,会是这样的
   log4j:WARN No appenders could be found for logger (com.syp.log.Test).
   org.apache.commons.logging.impl.Log4JLogger
   log4j:WARN Please initialize the log4j system properly.
   首先输出log4jLogger很容易理解理,因为环境中有log4j,但会输入其实两个警靠的语句,是因为我们没有对log4j初始化,固才有警告语句

  
   if ((logClassName == null) && isLog4JAvailable()) {
   logClassName = "org.apache.commons.logging.impl.Log4JLogger";
   }
  
   if ((logClassName == null) && isJdk14Available()) {
   logClassName = "org.apache.commons.logging.impl.Jdk14Logger";
   }
  

   if ((logClassName == null) && isJdk13LumberjackAvailable()) {
   logClassName =
   "org.apache.commons.logging.impl.Jdk13LumberjackLogger";
   }
  
   if (logClassName == null) {
   logClassName = "org.apache.commons.logging.impl.SimpleLog";
   }
  
   return (logClassName);
  
   }

 

 

 

 

 

 

 通过上面我的例子我们可能得出:只要我们实现了通用日志包中log接口和logfactory,我们就可以用自己日志记录来处理。


上文中有很多地方说的不是很明白,有不懂之处可互相交流,小弟也是才接触这东西,望见谅
下面是上例的源码:第一次运行时请将log4j.jar去掉,才能看到如上述说明的一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值