关于Java日志框架应用总结

在使用java进行开发时,日志模块基本是一个必不可少的部分,它对调试,记录运行,问题定位都起到很重要的作用。

常用的日志框架包括:

     1、sf4j( http://www.slf4j.org/);
     2、commons-logging( http://commons.apache.org/proper/commons-logging/);
     3、log4j( http://logging.apache.org/log4j/1.2/);
     4、JDK自带logging;
     5、其它日志框架。
这些日志框架的常用功能和使用方式都是大体相同的(在这里我们不讨论这些日志框架原理,如何使用,关联,以及区别),所以我们有必要对它进行一个简单的归纳,形成自己(代码或者项目中)日志模块(包括了日志接口和代理实现)。

归纳接口(LoggerAdapter)如下:
//==============================================================================
//
//     @author Slive
//     @date  2013-6-18
//
//==============================================================================
package org.slive.logging;


/**
* Self-defining logger interface.
* it can replace any loggers simply.
* <ul>    
*      <li>{@linkplain java.util.logging.Logger}
*      <li>{@linkplain org.slf4j.Logger}
*      <li>{@linkplain org.apache.log4j.Logger}
*      <li>{@org.apache.commons.logging.Log}
* </ul>
* @author Slive
*/
public interface LoggerAdapter
{
     public void info(String msg);
     public void info(Throwable ex);
     public void info(String msg,Throwable ex);
     public void info(String msg,Object... params);
    
     public void debug(String msg,Throwable ex);
     public void debug(String msg);
     public void debug(Throwable ex);
     public void debug(String msg,Object... params);
    
     public void error(String msg,Throwable ex);
     public void error(String msg);
     public void error(Throwable ex);
     public void error(String msg,Object... params);
    
     public void warn(String msg);
     public void warn(Throwable ex);
     public void warn(String msg,Throwable ex);
     public void warn(String msg,Object... params);
    
}

举例对“java.util.logging.Logger”进行适配,实现(LoggerJavaAdapter)如下:
//==============================================================================
//
//     @author Slive
//     @date  2013-6-18
//
//==============================================================================
package org.slive.logging.java;

import java.util.logging.Level;
import java.util.logging.Logger;

import org.slive.logging.LoggerAdapter;

/**
* A simple logger's adapter of <code>java.util.logging.Logger</code>
* @see java.util.logging.Logger
* @author Slive
*/
public class LoggerJavaAdapter implements LoggerAdapter
{
     private Logger logger;

     public LoggerJavaAdapter(Class clazz)
     {
          logger = Logger.getLogger(clazz != null ? clazz.getName() : " ");
     }

     @Override
     public void debug(String msg, Throwable ex)
     {
          logger.log(Level.FINEST, msg, ex);
     }

     @Override
     public void debug(String msg)
     {
          logger.log(Level.FINEST, msg);
     }

     @Override
     public void debug(Throwable ex)
     {
          if (ex == null)
          {
               logger.log(Level.FINEST, null);
          } else
          {
               logger.log(Level.FINEST, ex.getMessage(), ex);
          }
     }

     @Override
     public void debug(String msg, Object... params)
     {
          logger.log(Level.FINEST, msg, params);
     }

     @Override
     public void error(String msg, Throwable ex)
     {
          logger.log(Level.SEVERE, msg, ex);
     }

     @Override
     public void error(String msg)
     {
          logger.log(Level.SEVERE, msg);
     }

     @Override
     public void error(Throwable ex)
     {
          if (ex == null)
          {
               logger.log(Level.SEVERE, null);
          } else
          {
               logger.log(Level.SEVERE, ex.getMessage(), ex);
          }
     }

     @Override
     public void error(String msg, Object... params)
     {
          logger.log(Level.SEVERE, msg, params);
     }

     @Override
     public void info(String msg, Throwable ex)
     {
          logger.log(Level.INFO, msg, ex);
     }

     @Override
     public void info(String msg)
     {
          logger.log(Level.INFO, msg);
     }

     @Override
     public void info(Throwable ex)
     {
          if (ex == null)
          {
               logger.log(Level.INFO, null);
          } else
          {
               logger.log(Level.INFO, ex.getMessage(), ex);
          }
     }

     @Override
     public void info(String msg, Object... params)
     {
          logger.log(Level.INFO, msg, params);
     }

     @Override
     public void warn(String msg, Throwable ex)
     {
          logger.log(Level.WARNING, msg, ex);
     }

     @Override
     public void warn(String msg)
     {
          logger.log(Level.WARNING, msg);
     }

     @Override
     public void warn(Throwable ex)
     {
          if (ex == null)
          {
               logger.log(Level.WARNING, null);
          } else
          {
               logger.log(Level.WARNING, ex.getMessage(), ex);
          }
     }

     @Override
     public void warn(String msg, Object... params)
     {
          logger.log(Level.WARNING, msg, params);
     }

}
同时实现“LoggerAdapterFacory”类,如下:
//==============================================================================
//
//     @author Slive
//     @date  2013-6-18
//
//==============================================================================
package org.slive.logging.java;

import org.slive.logging.LoggerAdapter;


/**
* The factory of implements logger adapter.if is in need,you can rewrite it.
* @author Slive
*/
public class LoggerAdapterFacory
{
     public static LoggerAdapter getLoggerAdapter(Class clazz)
     {
          //TODO according to specific circumstance
          //such as 'LoggerJava'
          return new LoggerJavaAdapter(clazz);
     }
}
如有需要,可到http://download.csdn.net/detail/lipslive/5607375下载源码。

这样做的理由是:

1、(代码或者项目中)自定义一个日志模块,在团队开发中,是一个好的开发习惯;

2、对于开发者,一般只用到日志模块中常用的按照不同级别记录日志的功能,并不需要其它太多的功能,这样可以给调用的日志(logger)类进行瘦身;

3、自定义日志模块(接口及代理实现),而不直接使用第三方日志框架接口,避免在日志框架升级或者切换时,代码过多耦合。
      这个举例说明一下:
     比如,在某一项目开始时使用的是“log4j”框架,后面经过研究发现“sf4j”框架功能更强大,想切换到“sf4j”。常规的做法是,修改项目中每一处调用到“log4j”相关模块的代码。如果是项目比较大,所要花费的工作量也真不少,但如果使用了上面的方式,则只需要实现“LoggerAdapter”接口,使之与具体的日志(logger)进行适配,并且(如果必要)重写或者调整 LoggerAdapterFacory类即可。

局限性:不能满足高级开发者的需要,但可以以此思路,进行深入改造后,还是可以满足的。
转自: http://blog.csdn.net/lipslive/article/details/9124695
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值