commons-logging log4j的联系区别

阅读更多

1、Apache通用日志接口(commons-logging.jar)介绍

Apache Commons包中的一个,包含了日志功能,必须使用的jar包。这个包本身包含了一个Simple Logger,但是功能很弱。在运行的时候它会先在CLASSPATH找log4j,如果有,就使用log4j,如果没有,就找JDK1.4带的 java.util.logging,如果也找不到就用Simple Logger。commons-logging.jar的出现是一个历史的的遗留的遗憾,当初Apache极力游说Sun把log4j加入JDK1.4,然而JDK1.4项目小组已经接近发布JDK1.4产品的时间了,因此拒绝了Apache的要求,使用自己的java.util.logging,这个包的功能比log4j差的很远,性能也一般。后来Apache就开发出来了commons-logging.jar用来兼容两个logger。因此用 commons-logging.jar写的log程序,底层的Logger是可以切换的,你可以选择log4j,java.util.logging或者它自带的Simple Logger。不过我仍然强烈建议使用log4j,因为log4j性能很高,log输出信息时间几乎等于System.out,而处理一条log平均只需要5us。

Apache通用日志包提供一组通用的日志接口,用户可以自由选择实现日志接口的第三方软件
通用日志目前支持以下日志实现
Log4j日志器
JDK1.4Logging
SimpleLog日志器
NoOpLog日志器

1.1、Log 接口
Common-logging的应用程序编程接口主要在org.apache.commons.logging.log接口中定义,这个接口主要定义了两类操作: 一类是级别判断,用于减少不必要的日志操作的参数计算从而提高性能。另一类是日志登记,按照级别登记日志信息。
通用日志包把日志消息分为6种级别Fatal,Error,Warn,Info,Debug和Trace

org.apache.commons.logging.Log接口代表日志器,它提供了一组输出日志的方法,日志登记操作分又为两小类:一个参数的日志信息登记操作和两个参数的日志信息登记操作。前者对三类用户都适用,后者用于打印日志登记处的出错堆栈信息,所以更适用于开发人员调式与维护使用
       fatal(Object message);
       error(Object message);
       warn (Object message);
       info (Object message);
       debug(Object message);
       trace(Object message);

       debug(Object message, Throwable t); 
       trace(Object message, Throwable t);
       ......
      这里需要注意的是,只有当输出日志的级别大于等于日志器配置的日志级别时,这个方法才会真正被执行.例如日志器设置日志级别为Warn,那么程序中,它的
      fatal(),error(),warn()方法会被执行,而info(),debug(),trace()
      不会被执行.
      Log接口还提供了一组判断是否允许输出特定级别日志消息的方法

       isFatalEnable();
       isErrorEnable();
       isWarnEnable();
       isInfoEnable();
       isDebugEnable();
       isTraceEnable();
1.2、LogFactory接口
      org.apache.commons.logging.LogFactory接口提供了获得日志器实例的两个静态方法
       public static Log getLog(String name)throws LogConfigurationException
       public static Log getLog(Class class)throws LogConfigurationException
       public static Log getLog(Class class)
       {
        getLog(class.getName());
       }

2、Log4J介绍

Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

2.1、Log4J配置说明: 

log4j配置文件有三个主要的组件:Logger,Appender和Layout,分别为日志类型,日志输出目的地,日志输出格式. 
跟proxool类似,log4j支持两种类型的配置文件,xml和properties 。log4j.properties配置文件如下:(需要把log4j的配置文件放在classpath下)

2.1.1 log4j.rootLogger =INFO, stdout , R

此句为将等级为INFO的日志信息输出到stdout和R这两个目的地,其语法为:

log4j.rootLogger = [ level ] , appenderName, appenderName, …

其中,level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,只有等于及高于这个级别的才进行处理,则应用程序中所有DEBUG级别的日志信息将不被打印出来。ALL:打印所有的日志,OFF:关闭所有的日志输出。 appenderName就是指定日志信息输出到哪个地方。可同时指定多个输出目的地。  

2.1.2 log4j.appender.stdout=org.apache.log4j.ConsoleAppender

此句为定义名为stdout的输出端是哪种类型

 

Appender 负责控制日志记录操作的输出。

  其语法为:

  log4j.appender.appenderName = fully.qualified.name.of.appender.class

  log4j.appender.appenderName.option1 = value1

  …

  log4j.appender.appenderName.optionN = valueN

  这里的appenderName为在①里定义的,可任意起名。

  其中,Log4j提供的appender有以下几种:

  org.apache.log4j.ConsoleAppender(控制台),

  org.apache.log4j.FileAppender(文件),

  org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),

  org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),可通过log4j.appender.R.MaxFileSize=100KB设置文件大小,还可通过 log4j.appender.R.MaxBackupIndex=1设置为保存一个备份文件。

  org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

  例如:log4j.appender.stdout=org.apache.log4j.ConsoleAppender

  定义一个名为stdout的输出目的地,ConsoleAppender为控制台。

2.1.3配置日志信息的格式(布局)Layout

  Layout 负责格式化Appender的输出。

  其语法为:

  log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class

  log4j.appender.appenderName.layout.option1 = value1

  …

  log4j.appender.appenderName.layout.optionN = valueN

  其中,Log4j提供的layout有以下几种:

  org.apache.log4j.HTMLLayout(以HTML表格形式布局),

  org.apache.log4j.PatternLayout(可以灵活地指定布局模式),

  org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),

  org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

2.1.4格式化日志信息
Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:

  %m 输出代码中指定的消息

  %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL

  %r 输出自应用启动到输出该log信息耗费的毫秒数

  %c 输出所属的类目,通常就是所在类的全名

  %t 输出产生该日志事件的线程名

  %n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”

  %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921

  %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数

2.2、关于Log4j比较全面的配置

2.2.1 应用于控制台

  • log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender   
  • log4j.appender.Threshold=DEBUG   
  • log4j.appender.CONSOLE.Target=System.out   
  • log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout   
  • log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n   
  • #log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n
  • 2.2.2应用于文件

  • log4j.appender.FILE=org.apache.log4j.FileAppender   
  • log4j.appender.FILE.File=file.log   
  • log4j.appender.FILE.Append=false
  • log4j.appender.FILE.layout=org.apache.log4j.PatternLayout   
  • log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n   
  • # Use this layout for LogFactor 5 analysis
  • 2.2.3 应用于回滚文件

    log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender  

    log4j.appender.ROLLING_FILE.Threshold=ERROR  

    log4j.appender.ROLLING_FILE.File=rolling.log  

    log4j.appender.ROLLING_FILE.Append=true

    log4j.appender.ROLLING_FILE.MaxFileSize=10KB  

    log4j.appender.ROLLING_FILE.MaxBackupIndex=1

    log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout  

    log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n 

    2.2.4应用于socket

  • log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender   
  • log4j.appender.SOCKET.RemoteHost=localhost   
  • log4j.appender.SOCKET.Port=5001
  • log4j.appender.SOCKET.LocationInfo=true
  • # Set up for Log Facter 5
  • log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout   
  • log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n   
  • # Log Factor 5 Appender   
  • log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender   
  • log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
  • 2.2.5应用于邮件

  • log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender   
  • log4j.appender.MAIL.Threshold=FATAL   
  • log4j.appender.MAIL.BufferSize=10
  • [email protected]   
  • log4j.appender.MAIL.SMTPHost=www.wusetu.com   
  • log4j.appender.MAIL.Subject=Log4J Message   
  • [email protected]   
  • log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout   
  • log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
  • 2.2.6应用于数据库

  • log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender   
  • log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test 
  • log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver   
  • log4j.appender.DATABASE.user=root   
  • log4j.appender.DATABASE.password=   
  • log4j.appender.db.sql=INSERT INTO SS_LOG4J_LOG (PRIORITY,LOGDATE,CLASS,METHOD,MSG) VALUES('%p','%d{yyyy-MM-dd HH:mm:ss}','%C','%M','%m')  
  • log4j.appender.db.layout=org.apache.log4j.PatternLayout log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout   
  • log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
  • 3、Log4J的使用

    3.1、在application中的使用:

    将log4j.jar和common-logging.jar加入到build path中即可。

    3.2 在web应用中使用log4j

      3.2.1 创建一个集成httpservlet的servlet文件,在init中对log4j进行初始化

    public class log4jInit extends HttpServlet {

        
        @Override
        public void init() throws ServletException {
            Log log = LogFactory.getLog(this.getClass().getName());
            //Logger logger = Logger.getLogger(this.getClass());        
            String prefix = this.getServletContext().getRealPath("/");
            System.out.println(prefix);
            String file = this.getServletConfig().getInitParameter("log4j-init-file");
            if(file!=null)
                PropertyConfigurator.configure(prefix+file);
        }

        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
        }

        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
        }

    }

       3.2.2 在web.xml中定义这个servlet,并在应用启动时启动


        log4jInit
        com.highsoft.log4j.log4jInit
       
            log4j-init-file
            /WEB-INF/classes/log4j1.properties
       

        1

    3.3 在Spring中集成log4j

    3.3.1 在web.xml中集成



           log4jRefreshInterval
           60000


       
    org.springframework.web.util.Log4jConfigListener

    你可能感兴趣的:(Apache,Common-Logging,log4j,log,配置)