Log4J的深入理解(使用了common-logging)

先看下面的代码:加入了common-logging的jar包
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class MyTest2 {

	static Log log = LogFactory.getLog(MyTest2.class);

	public void log() {
		log.debug("Debug info.");
		log.info("Info info");
		log.warn("Warn info");
		log.error("Error info");
		log.fatal("Fatal info");

	}

	/**
	 * 
	 * @param args
	 * 
	 */

	public static void main(String[] args) {
		MyTest2 test = new MyTest2();
		test.log();

	}
}


1 日志信息分为五个等级
引用
all < debug < info < warn < error < fatal < off

2 继承思想

  1) 也就是一个Log可以继承另外一个Log的属性(输出到哪里,日志等级,日志格式等等)
  2) 实现方式就是如下:
   Log4j是根据Log的名字来判断继承关系的,比如:

名字为“com.zhlmmc.lib”的Log就是“com.zhlmmc.lib.log”的parent,明白了吧!Log4j还有一个rootLogger,相当于Java的Object。

回过头来看“LogFactory.getLog(MyTest2.class)”这里的“MyTest2.class”事实上传进去的是Test这个类的完整路径(包名+类名),“MyTest2.MyTest2”,这样如果存在“MyTest2”这个Log那么MyTest2这个Log就继承它,否则就继承rootLogger。

3 关于logger的两点说明

1)用同名参数调用Logger.getLogger(String name)将返回同一个logger的引用。故可以在一个地方配置logger,在另外一个地方获得配置好的logger,而无须相互间传递logger的引用。
2)logger的创建可以按照任意的顺序,即,父logger可以后于子logger被创建。log4j将自动维护logger的继承树。

4 常见的配置文件

  虽然可以用xml或者在运行时用Java来配置Log4j,但还是properties文件好用啊!

引用
log4j.rootLogger=info, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n


  分析一下:
   第一行,配置log4j.rootLogger你明白吧。应为它是根,总得配置一下,否则别的Log继承什么啊。其他的Log可以配置也可以不配置。等号后面的第一个参数表示日志级别,可以填五个级别中的一种,后面的参数都是让Log知道输出到哪里,如果你想让日志输出到两个地方就加两个输出参数,比如:

log4j.rootLogger=info, stdout, file

  这里的info表示,该Log的日志级别为info,所有级别小于info的日志都不会被记录。比如使用这个配置文件的话,我刚开始举的那个类中

  log.debug("Debug info.");

  这句话是不起作用的,因为debug的级别小于info。这样就很容易控制什么信息在调试的时候要显示,什么信息在发布的时候要去掉。这些都不用改代码,很方便吧。

  但,stdout和file又是什么呢?

  接着往下看,就是配置stdout了,这个名字是随便取的,你可以叫它A:

  log4j.appender.A=org.apache.log4j.ConsoleAppender

  那么上面的rootLogger的参数stdout也要改成A,其他用到的地方当然也要改。这里的关键不是名字,而是appender类型,比如这里的“ConsoleAppender”,看明白了吧,输出到Console。后面两行都是设置日志格式的,一般情况下你就照抄吧。既然是最简入门关注于理解Log4j的工作原理,我就不介绍file类型的appender了,一搜一大把。

  在实际的项目开发中,很可能遇到所引用的包用Log4j来记录日志,比如Hibernate。那么在这里你可以很容易的控制这个包如何记录日志。比如在上面的配置文件中加一行:

  log4j.logger.org.hibernate=fatal

  那么所有org.hibernate包下面的类就只会显示很少的信息,因为fatal的级别最高啊。

5 默认的log4j初始化过程

Logger类的静态初始化块(static initialization block)中对log4j的环境做默认的初始化。注意:如果程序员已经通过设置系统属性的方法来配置了log4j环境,则不需要再显式地调用XXXConfigurator.configure()方法来配置log4j环境了。

Logger的静态初始化块在完成初始化过程时将检查一系列log4j定义的系统属性。它所做的事情如下:
1) 检查系统属性log4j.defaultInitOverride,如果该属性被设置为false,则执行初始化;否则(只要不是false,无论是什么值,甚至没有值,都是否则),跳过初始化。
2)把系统属性log4j.configuration的值赋给变量resource。如果该系统变量没有被定义,则把resource赋值为"log4j.properties"。注意:在apache的log4j文档中建议使用定义log4j.configuration系统属性的方法来设置默认的初始化文件是一个好方法。
3)试图把resource变量转化成为一个URL对象url。如果一般的转化方法行不通,就调用org.apache.log4j.helpers.Loader.getResource(resource, Logger.class)方法来完成转化
4)如果url以".xml"结尾,则调用方法DOMConfigurator.configure(url)来完成初始化;否则,则调用方法PropertyConfigurator.configure(url)来完成初始化。如果url指定的资源不能被获得,则跳出初始化过程


6 Log4j的编码习惯

1)让每个类都拥有一个private static的Logger对象,用来输出该类中的全部日志信息
2)使用xml文件来完成对log4j环境的配置。在项目的main class中的静态初始化块里放log4j环境的配置代码。注意:在一个项目中,log4j环境只需要被配置一次,而不是在每个使用了logger的类里都需要调用一次
3)用MyClass.class作为参数创建该类的静态Logger对象

你可能感兴趣的:(java,log4j,common-logging)