apache common log & apache log4j



common log可以理解成适配(俺模式不是很好,文档上写的是wrapper),做这个适配器的目的是能够使用已有的工业标准log系统。common log实现的SimpleLog写的很简单的,就是用system.out/system.err往出输出。SimpleLog并不是一个工业标准的log,那要common log做什么呢?刚说过啦,做适配吗,只是提供了一个简单的默认实现——SimpleLog。当common log写时,已有的工业标准log系统有log4j、avalon等,common log的目的就是让用户选择将要使用的log,如果想要用avalon log,那就配置一下common log的commons-logging.properties文件,就可以让common-logging使用avalon log了。好像是jdk5.0吧,sun作了个java.util.logging,现在如果使用sun的5.0的jdk,而后用common log获取log时,默认都会使用jdk的log往出输出内容。但common log写完的时候,sun的log还没有出现,比如使用jdk1.4,把common log加入到classpath里去后,如果在commons-logging.properties没有指定其他log 实现时,总不能因为没有log实现而报错吧,因此就些了个SimpleLog,使用她往出输出log。

为什么一定要作这个common log适配器呢?哎……看看xml的api的状况就明白了,sax、dom、c****(sun的xml api,后来被sax干掉了,只能在jdk1.4中看到她了),那么多成形的xml api,到底用哪个,自己选吧,比如项目刚才开始的使用决定用dom,可能认为随机抓取文档结构比较多,因此用dmo,但项目二期的时候,mmd,发现顺序处理特别多,用dom慢的要死,受不了了,就转用sax,靠,那怎么办,不能二期的都用换成sax的而一期就用dom吧(实践证明有很多项目都这么干了),将处理xml的类都写到代码里定死了(其实也没什么,小项目没问题,不行老子就改),大项目一大就受不了,改一次会死很多人的.... 所以后来我们后知后觉的sun出了个jaxp,这玩意能通过配置选择处理xml的api,项目就都使用jaxp了,要改处理xml的api的话,就改jaxp的配置文件吧,其实common log和这个jaxp的作用差不多,就是能够让人在使用的时候通过配置文件指定用哪个api处理xml文件。这里本人排挤sun的意思,但sun的确在xml方面做的不够硬朗,但本人坚决拥护sun的领导地位。不像有些大公司做的也不够硬朗,我tmd就认为swing现在做的挺快的,哪像ajax那么sick,拿板砖的您就拍吧,呵呵。

跑题了,common log就挺好,开源社区定义的适配器,不像jcp还要那么长时间。需要是改log时,就配置一下commons-logging.properties吧。

如果在commons-loggng.properties,可以通过org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger显示指定使用使用log4j的作为默认log(其实不显示指定也行,common会先找log4j而后找jdk log的),而后再指定一下log4j的配置文件在哪里,就可以使用log4j了。以下是log4j的一些基本概念。

log4j一共有三个组成部分:logger、appender、layout。
logger不说了,就是日志的api,提供info、warn那些方法的
appender怎么翻译呢,不是StringBuilder#append那个append,可以把appender 理解成输出到哪里,比如输出到控制台、文件等。
layout好理解,就是输出的内容是什么格式的。

以下提供了一个例子:
commons-logging.properties:
# 指定common logger使用哪家提供的log
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
# log4j的配置文件在哪里放着呢
log4j.configuration=log4j.properties

log4j.properties
# log4j.rootLogger = [ level ] , appenderName, appenderName, ...
log4j.rootLogger=DEBUG, console, file

log4j.appender.console=org.apache.log4j.ConsoleAppender

log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.conversionPattern=%l [%t] %d %p: %m%n

log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.maxFileSize=10MB

log4j.appender.file.file=src/mytest/log4j.out
log4j.appender.file.append=true
log4j.appender.file.encoding=utf8
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.conversionPattern=%l [%t] %d %p: %m%n

CommonLogAndLog4j.java
package mylog.test;

imp ort org.apache.commons.logging.Log;
imp ort org.apache.commons.logging.LogFactory;

/**
 * <p>输出位置参考Appender的派生类,输出格式参考PatternLayout
 * @author wenhf
 * @version 1.0
 * @see org.apache.log4j.Appender
 * @see org.apache.log4j.PatternLayout
 * @since 1.0
 */
public class CommonLogAndLog4j {

    static Log log = LogFactory.getLog(CommonLogAndLog4j.class);
    public static void main(String[] args) {
        for(int i=0; i< 1000; i++) {
            log.info(new StringBuilder().append(i).append(". hello, 您好"));
        }
    }
} // CommonLogAndLog4j

两个配置文件,一段小代码,真小哈
commons-logging.properties没什么好说的了,就那么两行,看注释吧
麻烦的就是log4j.properties,但这里是有窍门的,只需要特殊记忆一下这行
log4j.rootLogger=DEBUG, console, file,log4j.rootLogger等号右边的格式是第一个说明root log的等级,这里的定义的是调试级,后面跟的是root都有那些appender,也就是root都能往哪些地方输出内容,这里定义的是能往console和file两个位置输出内容(console、file并没有特殊含义,就是随便起的名字)。下面的:

log4j.appender.console=org.apache.log4j.ConsoleAppender
这行是告诉log4j,console这个输出位置(appender),使用什么工具(类)往出内容,

log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.conversionPattern=%l [%t] %d %p: %m%n
而后通过一下两行说明输出内容的格式:

好麻烦,比如log4j.appender.console.layout,怎么知道有layout属性,还有其他什么属性,看org.apache.log4j.ConsoleAppender就知道了(下载源代码吧),他有个方法是setLayout,再看看有些其他什么setter就知道他有什么属性了。conversionPattern也一样,不知道%l [%t] %d %p: %m%n是什么意思,就看org.apache.log4j.PatternLayout的注释就ko了。

终于file那个append,就去看org.apache.log4j.RollingFileAppender吧,看看他的setter就都明白了,pojo好处多哈:) 

至于每一行的开头的log4j对应的当然是org.apache.log4j.Logger了,log4j.rootLogger和log4j.appender是Logger类实例的属性。这样些起配置文件来,感觉能轻松些。

当然log4j还有层次(hierarchy)的概念,可以理解成继承了,继承的规则呢,可以看看Logger继承的那个org.apache.log4j.Category,他就是用来实现logger的继承的,当然如果嫌麻烦,就看参考文献吧.

Reference:
http://commons.apache.org/logging/guide.html
http://logging.apache.org/log4j/1.2/manual.html
http://www.vipan.com/htdocs/log4jhelp.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值