来自:http://www.cnblogs.com/echozhjun/archive/2010/01/08/1641970.html
JDK Logger
JDK Logger在java.util.logging包下面,自从JDK1.4就有了,可是因为log4j的存在,这个Logger一直沉默着。Java自带的Logger,级别比Log4j还要详细,但是如果需要自定义日志输出格式,需要自己实现Formatter,有些不方便。
Log4j
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务 器、NT的事件记录器、UNIX Syslog守护进程等;用户也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,用户能够更加细致地控制日志的生成过程。这些可以通过一个 配置文件来灵活地进行配置,而不需要修改程序代码。
Slf4j
简单日记门面(Facade)SLF4J是为各种loging APIs提供一个简单统一的接口,从而使得最终用户能够在部署的时候配置自己希望的loging APIs实现。 Logging API实现既可以选择直接实现SLF4J接的loging APIs如: NLOG4J、SimpleLogger。也可以通过SLF4J提供的API实现来开发相应的适配器如Log4jLoggerAdapter、JDK14LoggerAdapter。
Apache-common-logging
Apache-common-logging是Apache的又一个开放源代码项目,为各种loging APIs提供统一的接口,从而使得用户能够在运行时动态的决定自己希望使用的loging APIs实现。Apache Common-Logging通过动态查找的机制,在程序运行时自动找出真正使用的日志库。Apache Common-Logging使用了ClassLoader寻找和载入底层的日志库,所以在需要多个ClassLoader比如OSGI编程的时候就会出现问题了。
Logback
Logback是由log4j创始人设计的又一个开源日记组件。logback当前分成三个模块:logback-core,logback- classic和logback-access。logback-core是其它两个模块的基础模块。logback-classic是log4j的一个 改良版本。此外logback-classic完整实现SLF4J API使你可以很方便地更换成其它日记系统如log4j或JDK14 Logging。logback-access访问模块与Servlet容器集成提供通过Http来访问日记的功能。
Apache commons logging自动查找当前实现Log顺序
1、首先在classpath下寻找自己的配置文件commons-logging.properties,如果找到,则使用其中定义的Log实现类;
2、如果找不到commons-logging.properties文件,则在查找是否已定义系统环境变量org.apache.commons.logging.Log,找到则使用其定义的Log实现类;建立一个叫 :CATALINA_OPTS 的环境变量,给他的值 : - Dorg.apache.commons.logging.Log = org.apache.commons.logging.impl.SimpleLog - Dorg.apache.commons.logging.simplelog.defaultlog = warn
3、否则,查看classpath中是否有Log4j的包,如果发现,则自动使用Log4j作为日志实现类;
4、否则,使用JDK自身的日志实现类(JDK1.4以后才有日志实现类);
5、否则,使用commons-logging自己提供的一个简单的日志实现类SimpleLog。
所以,如果要实现自己的日志系统,最简单的方法是在classpath下放 commons-logging.properties文件,内容为:
org.apache.commons.logging.Log=com.hundsun.test.mylogger.MyLog
一行就可以了。
2、如果找不到commons-logging.properties文件,则在查找是否已定义系统环境变量org.apache.commons.logging.Log,找到则使用其定义的Log实现类;建立一个叫 :CATALINA_OPTS 的环境变量,给他的值 : - Dorg.apache.commons.logging.Log = org.apache.commons.logging.impl.SimpleLog - Dorg.apache.commons.logging.simplelog.defaultlog = warn
3、否则,查看classpath中是否有Log4j的包,如果发现,则自动使用Log4j作为日志实现类;
4、否则,使用JDK自身的日志实现类(JDK1.4以后才有日志实现类);
5、否则,使用commons-logging自己提供的一个简单的日志实现类SimpleLog。
所以,如果要实现自己的日志系统,最简单的方法是在classpath下放 commons-logging.properties文件,内容为:
org.apache.commons.logging.Log=com.hundsun.test.mylogger.MyLog
一行就可以了。
Slf4j则使用的静态绑定技术,每个具体的Log实现都由具体包里的StaticLoggerBinder类来创建。所以具体Log的实现包只能放一个,否则会冲突。
要实现这个只需要在打好包的slf4j中把最开始的 StaticLoggerBinder类删除掉就可以了。挺有技巧的,虽然很简单。