日志解决方案
------------------------------------------------------------------------------------------------
一、org.apache.commons.logging.Log方案 (JCL方案)
二、slf4j方案
SLF4J和JCL的由来
------------------------------------------------------------------------------------------------
Java 世界里有许多实现日志功能的工具,最早得到广泛使用的是 log4j,许多应用程序的日志部分都交给了 log4j,不过作为开发者,希望自己的程序不要紧紧依赖某一个日志组件,假如一个应用程序用到了两个不同的日志组件,那么应用程序就会有两份日志输出,这可不是想要的结果。
为了解决这个问题,Apache Commons Logging (之前叫 Jakarta Commons Logging,JCL)出现了,JCL 只提供日志接口,具体的日志实现则在运行时动态寻找。这样一来开发者只需要针对 JCL 日志接口进行日志操作,而应用程序则可以在运行时动态选择自己喜好的日志组件。
所以即使到现在你仍会看到很多程序应用 JCL + log4j 这种搭配,不过当程序规模越来越庞大时,JCL的动态绑定并不是总能成功,具体原因大家可以 Google 一下,这里就不再赘述了。解决方法之一就是在程序部署时静态绑定指定的日志工具,这就是 SLF4J 产生的原因。
SLF4J提供的jar包在非常多,如下图,本文详细说一说用途
SLF4J是一套日志接口,不是实现。通过转换器可以使用Log4j,JDK Logging,Apache Commons-logging,slf4j-nop等日志实现(组件)。跟 JCL 一样,SLF4J 也是只提供 log 接口,具体的实现是在打包应用程序时所放入的绑定器(名字为 slf4j-XXX-version.jar)来决定,XXX 可以是 log4j12, jdk14, jcl, nop 等,他们实现了跟具体日志工具(比如 log4j)的绑定及代理工作。举个例子:如果一个程序希望用 log4j 日志工具,那么程序只需针对 slf4j-api 接口编程,然后在打包时再放入 slf4j-log4j12-version.jar 和 log4j.jar 就可以了。
slf4j+log4j的使用(常规)
--------------------------------------------
使用log4j做为底层日志工具,需要3个jar包:
slf4j-api-x.x.x.jar
slf4j-log4j12-x.x.x.jar
log4j-1.2.xx.jar
下载地址:
http://logging.apache.org/log4j/1.2/download.html
http://www.slf4j.org/download.html
slf4j+logback的使用(常规)
--------------------------------------------
一、logback介绍:
Logback是由log4j创始人设计的又一个开源日志组件。
Logback 分为三个模块:logback-core,logback-classic,logback-access
logback-core 是核心;
logback-classic 改善了 log4j,且自身实现了 SLF4J API,所以即使用 Logback 你仍然可以使用其他的日志实现,如原始的 Log4J,java.util.logging 等;
logback-access 让你方便的访问日志信息,如通过 http 的方式。
下载地址:
slf4j:http://www.slf4j.org/download.html
logback:http://logback.qos.ch/download.html
二、依赖的jar包
需要的配置文件和组件包,下面三个 jar 文件和一个 xml文件都是要放在项目的 ClassPath上
slf4j-api-1.6.1.jar
logback-classic-0.9.24.jar (logback-classic自身实现了 SLF4J API)
logback-core-0.9.24.jar
三、logback配置文件
[粘贴配置文件]
xxx-over-slf4j 桥接器|伦理电影www.akdy.cn
--------------------------------------------------------
现在还有一个问题,假如:
1、你正在开发应用程序的其它依赖包已使用了 JCL日志方案 ;
2、你正在开发应用程序的其它依赖包已使用了 java.util.logging;
3、你正在开发应用程序的其它依赖包已使用了 log4j;
现在你想统一日志方案,统一使用SLF4J。这时你需要一个桥接器(名字为 XXX-over-slf4j.jar)把他们的日志输出重定向到 SLF4J,所谓的桥接器就是一个假的日志实现工具,比如当你把 jcl-over-slf4j.jar 放到 CLASS_PATH 时,即使某个组件原本是通过 JCL 输出日志的,现在却会被 jcl-over-slf4j “骗到”SLF4J 里,然后 SLF4J 又会根据绑定器把日志交给具体的日志实现工具。
假如在 CLASS_PATH 里同时放置 log4j-over-slf4j.jar 和 slf4j-log4j12-version.jar 会发生什么情况呢?没错,日志会被踢来踢去,最终进入死循环。
slf4j+log4j的使用(兼容旧日志输出实现)
------------------------------------------------------
使用 SLF4J+log4j 的比较典型搭配就是把 slf4j-api、JCL 桥接器、java.util.logging(JUL)桥接器、log4j 绑定器、log4j 这5个 jar 放置在 CLASS_PATH 里。
slf4j-api-1.5.10.jar
jcl-over-slf4j-1.5.10.jar
jul-to-slf4j-1.5.10.jar
slf4j-log4j12-1.5.10.jar log4j 绑定器
log4j-1.2.14.jar log4j日志组件,日志输出实现
SLF4J+logback的使用(兼容旧日志输出实现)
------------------------------------------------------
使用 SLF4J+logback 的比较典型搭配就是把 slf4j-api、JCL 桥接器、java.util.logging(JUL)桥接器、log4j桥接器、 logback日志实现 这6个 jar 放置在 CLASS_PATH 里。
slf4j-api-1.6.1.jar
log4j-over-slf4j-1.6.1.jar
jcl-over-slf4j-1.6.1.jar
jul-to-slf4j-1.6.1.jar
logback-classic-0.9.27.jar (logback-classic自身实现了 SLF4J API)
logback-core-0.9.27.jar 日志组件,日志输出实现
Google AppEngine
------------------------------------------------------
不过并不是所有APP容器都是使用 log4j 的,比如 Google AppEngine 它使用的是 java.util.logging(JUL),这时应用 SLF4J 的搭配就变成 slf4j-api、JCL桥接器、logj4桥接器、JUL绑定器这4个 jar 放置在 WEB-INF/lib 里。