一,为什么要使用commons-logging+log4j?

commons-logging和log4j都是Apache下的开源项目。commons-logging的目的是为“所有的Java日志实现”提供一个统一的接口,使项目与日志实现工具解耦,它自身的日志功能比较弱(只有一个简单的 SimpleLog),所以一般不会单独使用它。Log4j的功能非常强大,是目前最主流的java日志工具。结合使用两者可以避免使项目与log4j紧密耦合,用户可以轻松切换到其他日志工具,同时又可以使用log4j的强大功能。

二,commons-logging如何自动选择适当的日志实现工具?

我们在使用commons-logging+日志实现工具时,我们的代码只需要和commons-logging打交道,由commons-logging去选择适当的日志实现工具。这里我们看一下commons-logging是如何去选择实现工具的:

,首先在classpath下寻找自己的配置文件commons-logging.properties,如果找到,则使用其中定义的Log实现类:

  1.org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog 这个配置,commons-logging会使用commons-logging的SimpleLog

  2.org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger 这个配置,commons-logging就会选择使用log4j

  3.org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger 这个配置,commons-logging会选择jdk的logger

二,如果找不到commons-logging.properties文件,则在查找是否已定义系统环境变量org.apache.commons.logging.Log,找到则使用其定义的Log实现类

三,否则,查看classpath中是否有Log4j的包,如果发现,则自动使用Log4j作为日志实现类。
四,否则,使用JDK自身的日志实现类(JDK1.4以后才有日志实现类)。
五,否则,使用commons-logging自己提供的一个简单的日志实现类SimpleLog。
可见,commons-logging总是能找到一个日志实现类,并且尽可能找到一个最合适的日志实现类。
为了简化配置,我们可以不使用commons-logging的配置文件,也不设置commons-logging相关的环境变量,只需将log4j的包放入classpath就可以了,这样就可以完成commons-logging与log4j的结合。如果以后不想使用log4j,只需将log4j的包 从classpath中移除就可以了。

三,如何在代码中输出日志?

1.导入所需commons-logging的类

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

如果愿意简化的话,还可以两行合为一行:
import org.apache.commons.logging.*;

2、在自己的类中定义一个org.apache.commons.logging.Log类的私有静态类成员:

private static Log log = LogFactory.getLog(YouClassName.class);

注意这里定义的是static成员,以避免产生多个实例。

LogFactory.getLog()方法的参数使用的是当前类的class,这是目前被普通认为的最好的方式。为什么不写作LogFactory.getLog(this.getClass())?因为static类成员访问不到this指针!

3.使用静态类变量输出日志信息

  为了方便的控制日志输出,把日志分成了不同的级别,从低到高分别是调试,信息,警告,错误,致命错误。这样我们可以通过log4j的配置决定只输出某个级别以上的日志。例如,在开发时我们将debug(调试)及以上的日志全部输出,而在项目正常运行时,设置为只输出warn(警告)及以上的日志。

1.log.debug("debug");
//输出信息级别的日志信息
2.log.info("information");
//输出警告级别的日志信息
3.log.warn("warning");
//输出错误级别的日志信息
4.log.error("error");
//输出致命错误级别的日志信息
5.log.fatal("fatal");
正因为我们可以通过配置文件来设置日志输出的级别,所以写代码时我们并不知道某条日志是不是会真正输出,比如
log.debug("debug");

根据不同的性质,日志信息通常被分成不同的级别,从低到高依次是:“调试(DEBUG)”“信息(INFO)”“警告(WARN)”“错误(ERROR)”“致命错误(FATAL)”。为什么要把日志信息分成不同的级别呢?这实际上是方便我们更好的控制它。比如,通过Log4j的配置文件,我们可以设置“输出‘调试’及以上级别的日志信息”(即“调试”“信息”“警告”“错误”“致命错误”),这对项目开发人员可能是有用的;我们还可以设置“输出“警告”及以上级别的日志信息”(即“警告”“错误”“致命错误”),这对项目最终用户可能是有用的。 仅从字面上理解,也可以大致得出结论:最常用的应该是debug()和info();而warn()、error()、fatal()仅在相应事件发生后才使用。  使用commons-logging的日志接口非常的简单,不需要记忆太多东西:仅仅用到了两个类Log, LogFactory,并且两个类的方法都非常少,同时参数又非常简单。

下面给出一个完整的Java类的代码:
package liigo.testlog;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class TestLog {
private static Log log = LogFactory.getLog(TestLog.class);
public void test() {
log.debug("111");
log.info("222");
log.warn("333");
log.error("444");
log.fatal("555");
}

public static void main(String[] args) {
TestLog testLog = new TestLog();
testLog.test();
}
}

注意:配置文件log4j.properties对Log4j来说是必须的。如果classpath中没有该配置文件,或者配置不对,将会引发运行时异常。

  1. 这样,要正确地应用Log4j输出日志信息,log4j.properties的作用就很重要了。好在该文件有通用的模板,复制一份(稍加修改)就可以使用。几乎每一个Java项目目录内都会有一个log4j.properties文件,可下载几个Java开源项目源代码查看。本文最后也附一个模板性质的log4j.properties文件,直接复制过去就可以用,或者根据自己的需要稍加修改。后文将会log4j.properties文件适当作一些介绍。
  2.  
  3. 关于Log4j比较全面的配置
  4. LOG4J的配置之简单使它遍及于越来越多的应用中了:Log4J配置文件实现了输出到控制台、文件、
  5.  
  6. 回滚文件、发送日志邮件、输出到数据库日志表、自定义标签等全套功能。择其一二使用就够用了
  7.  
  8. log4j.rootLogger=DEBUG,CONSOLE,A1,im
  9. log4j.addivity.org.apache=true
  10.  
  11. # 应用于控制台
  12. log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
  13. log4j.appender.Threshold=DEBUG
  14. log4j.appender.CONSOLE.Target=System.out
  15. log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
  16. log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
  17. #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
  18.  
  19. #应用于文件
  20. log4j.appender.FILE=org.apache.log4j.FileAppender
  21. log4j.appender.FILE.File=file.log
  22. log4j.appender.FILE.Append=false
  23. log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
  24. log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
  25. # Use this layout for LogFactor 5 analysis
  26.  
  27. # 应用于文件回滚
  28. log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
  29. log4j.appender.ROLLING_FILE.Threshold=ERROR
  30. log4j.appender.ROLLING_FILE.File=rolling.log
  31. log4j.appender.ROLLING_FILE.Append=true
  32. log4j.appender.ROLLING_FILE.MaxFileSize=10KB
  33. log4j.appender.ROLLING_FILE.MaxBackupIndex=1
  34. log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
  35. log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
  36.  
  37. #应用于socket
  38. log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender
  39. log4j.appender.SOCKET.RemoteHost=localhost
  40. log4j.appender.SOCKET.Port=5001
  41. log4j.appender.SOCKET.LocationInfo=true
  42. # Set up for Log Facter 5
  43. log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
  44. 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
  45.  
  46. # Log Factor 5 Appender
  47. log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
  48. log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
  49.  
  50. # 发送日志给邮件
  51. log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
  52. log4j.appender.MAIL.Threshold=FATAL
  53. log4j.appender.MAIL.BufferSize=10
  54. log4j.appender.MAIL.From=web@www.wuset.com
  55. log4j.appender.MAIL.SMTPHost=www.wusetu.com
  56. log4j.appender.MAIL.Subject=Log4J Message
  57. log4j.appender.MAIL.To=web@www.wusetu.com
  58. log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
  59. log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
  60.  
  61. # 用于数据库
  62. log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
  63. log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
  64. log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
  65. log4j.appender.DATABASE.user=root
  66. log4j.appender.DATABASE.password=
  67. log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')
  68. log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
  69. log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
  70.  
  71. log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
  72. log4j.appender.A1.File=SampleMessages.log4j
  73. log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j'
  74. log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout
  75.  
  76. #自定义Appender
  77. log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
  78.  
  79. log4j.appender.im.host = mail.cybercorlin.net
  80. log4j.appender.im.username = username
  81. log4j.appender.im.password = password
  82. log4j.appender.im.recipient = corlin@cybercorlin.net
  83.  
  84. log4j.appender.im.layout=org.apache.log4j.PatternLayout
  85. log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
  86.  
  87. log4j.properties 使用
    一.参数意义说明
    输出级别的种类
    ERRORWARNINFODEBUG
    ERROR 为严重错误 主要是程序的错误
    WARN 为一般警告,比如session丢失
    INFO 为一般要显示的信息,比如登录登出
    DEBUG 为程序的调试信息
    配置日志信息输出目的地
    log4j.appender.appenderName = fully.qualified.name.of.appender.class
    1.org.apache.log4j.ConsoleAppender(控制台)
    2.org.apache.log4j.FileAppender(文件)
    3.org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
    4.org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
    5.org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
    配置日志信息的格式
    log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
    1.org.apache.log4j.HTMLLayout(以HTML表格形式布局),
    2.org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
    3.org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
    4.org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
    控制台选项
    Threshold=DEBUG:指定日志消息的输出最低层次。
    ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
    Target=System.err:默认情况下是:System.out,指定输出控制台
    FileAppender 选项
    Threshold=DEBUF:指定日志消息的输出最低层次。
    ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
    File=mylog.txt:指定消息输出到mylog.txt文件。
    Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
    RollingFileAppender 选项
    Threshold=DEBUG:指定日志消息的输出最低层次。
    ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
    File=mylog.txt:指定消息输出到mylog.txt文件。
    Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
    MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
    MaxBackupIndex=2:指定可以产生的滚动文件的最大数。
    log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n
    日志信息格式中几个符号所代表的含义:
     -X号: X信息输出时左对齐;
     %p: 输出日志信息优先级,即DEBUGINFOWARNERRORFATAL,
     %d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:20021018 221028921
     %r: 输出自应用启动到输出该log信息耗费的毫秒数
     %c: 输出日志信息所属的类目,通常就是所在类的全名
     %t: 输出产生该日志事件的线程名
     %l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main (TestLog4.java:10)
     %x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
     %%: 输出一个"%"字符
     %F: 输出日志消息产生时所在的文件名称
     %L: 输出代码中的行号
     %m: 输出代码中指定的消息,产生的日志具体信息
     %n: 输出一个回车换行符,Windows平台为"\r\n"Unix平台为"\n"输出日志信息换行
     可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
     1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
     2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。
     3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
     4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边较远输出的字符截掉。
    加载实例

  1.  

使用commons-logging和log4j记录日志的更多相关文章

  1. Taxonomy of class loader problems encountered when using Jakarta Commons Logging(转)

    Acknowledgments I would like to thank Jacob Kjome for reviewing early drafts of this document. His c ...

  2. org.apache.log4j与org.apache.commons.logging这两个包有什么区别

    apache common logging是一种log的框架接口,它本身并不实现log记录的功能,而是在运行时动态查找目前存在的日志库,调用相关的日志函数,从而隐藏具体的日志实现log4j是具体的日志 ...

  3. Java中的日志——Java.util.logging、log4j、commons-logging

    Java中给项目程序添加log主要有三种方式,一使用JDK中的java.util.logging包,一种是log4j,一种是commons-logging.其中log4j和commons-loggin ...

  4. 浅谈如何使用Log4j记录日志

    一.什么是log4j Log4J是Apache的一个开放源代码的项目.通过使用Log4J,程序员可以控制日志信息输送的目的地,包括控制台,文件,GUI组件和NT事件记录器,也可以控制每一条日志的输出格 ...

  5. 使用slf4j取代Apache Commons Logging

    假如你正在开发应用程序所调用的组件当中已经使用了 JCL(之前叫 Jakarta Commons Logging,JCL) 的,还有一些组建可能直接调用了 java.util.logging,这时你需 ...

  6. 廖雪峰Java3异常处理-2断言和日志-3使用Commons Logging

    Commons Logging是Apache创建的日志模块: 可以挂接不同的日志系统 可以通过配置文件指定挂接的日志系统 自动搜索并使用Log4j 如果Log4j不存在,使用JDK Logging(J ...

  7. Log4j记录日志使用方法

    1.导入相关JAR包 log4j-1.2.15.jar slf4j-api-1.6.1.jar slf4j-log4j12-1.6.1.jar log4jdbc4-1.2.jar 2.配置log4j. ...

  8. 使用Commons Logging

    Commons Logging 和Java标准库提供的日志不同,Commons Logging是一个第三方日志库,它是由Apache创建的日志模块,需要导入commons-logging-1.2.ja ...

  9. Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

    学习架构探险,从零开始写Java Web框架时,在学习到springAOP时遇到一个异常: "C:\Program Files\Java\jdk1.7.0_40\bin\java" ...

随机推荐

  1. [zz] demand require request用法辨析

    http://zhidao.baidu.com/link?url=9Q50HiOF1fWav1nSnREbc_H1jTuAHxAjeVLbZoB5bGO3ZehPxLhQdob4oGO3slMRl0W ...

  2. [入门]bower安装和使用

    bower安装和使用 字数745 阅读10127 评论2 喜欢3 bower的安装 1,首先在我的系统 安装 nodejs.因为我的系统是windows,还需要安装msysgit,注意图二中的选项 m ...

  3. Unity2D多分辨率屏幕适配方案(转载)

    一下内容转自:http://imgtec.eetrend.com/forum/3992 此文将阐述一种简单有效的Unity2D多分辨率屏幕适配方案,该方案适用于基于原生开发的Unity2D游戏,即没有 ...

  4. Atcoder CODE FESTIVAL 2016 qual C 的E题 Encyclopedia of Permutations

    题意: 对于一个长度为n的排列P,如果P在所有长度为n的排列中,按照字典序排列后,在第s位,则P的value为s 现在给出一个长度为n的排列P,P有一些位置确定了,另外一些位置为0,表示不确定. 现在 ...

  5. ant 自定义taskdef的工作目录

    上次同事在用ant执行多层目录的测试用例的时候遇到了一些问题,也就是自定义的taskdef的工作目录总是在开始执行ant的那个目录,而有一些地方用到了当前目录,因此很多测试用命的代码出现了“找不到自定 ...

  6. JSTL+MyEclipse8.5+Tomcat配置

    使用JSTL的时候需要配置,即导入stdandard.jar和jstl.jar包,并在web.xml下对jstl进行配置.下面是使用步骤: 1. 解压jakarta-taglibs-standard- ...

  7. sql 分组查询及格不及格人数

    select score as 类别,count(*) as 人数 from (select case when fen>=60 then '及格' else '不及格' end as scor ...

  8. 解决box-flex不均等分的问题

    我想当你上手css3的时候后一定为他的强大而感到震惊,但是震惊之后带来的一定是苦恼,因为他太TM变态了! 我之所以这么说是因为我今天写box-flex的时候遇到了一个可以让我蛋碎的问题~~~ 首先,b ...

  9. NHibernate系列文章十七:NHibernate Session管理(附程序下载)

    摘要 NHibernate的Session的管理涉及到NHibernate的两个最重要的对象ISessionFactory和ISession.ISessionFactory的生成非常消耗资源,通常都在 ...

  10. Eclipse JSP/Servlet 环境搭建

    Eclipse JSP/Servlet 环境搭建 本文假定你已安装了 JDK 环境,如未安装,可参阅 Java 开发环境配置. 我们可以使用 Eclipse 来搭建 JSP 开发环境,首先我们分别下载 ...