跳至主要内容

日志工具 SLF4J 的来龙去脉

Java 界里有许多实现日志功能的工具,最早得到广泛使用的是 log4j,许多应用程序的日志部分都交给了 log4j,不过作为组件开发者,他们希望自己的组件不要紧紧依赖某一个工具,毕竟在同一个时候还有很多其他很多日志工具,假如一个应用程序用到了两个组件,恰好两个组件使用不同的日志工具,那么应用程序就会有两份日志输出了。

为了解决这个问题,Apache Commons Logging (之前叫 Jakarta Commons Logging,JCL)粉墨登场,JCL 只提供 log 接口,具体的实现则在运行时动态寻找。这样一来组件开发者只需要针对 JCL 接口开发,而调用组件的应用程序则可以在运行时搭配自己喜好的日志实践工具。

所以即使到现在你仍会看到很多程序应用 JCL + log4j 这种搭配,不过当程序规模越来越庞大时,JCL的动态绑定并不是总能成功,具体原因大家可以 Google 一下,这里就不再赘述了。解决方法之一就是在程序部署时静态绑定指定的日志工具,这就是 SLF4J 产生的原因。

跟 JCL 一样,SLF4J 也是只提供 log 接口,具体的实现是在打包应用程序时所放入的绑定器(名字为 slf4j-XXX-version.jar)来决定,XXX 可以是 log4j12, jdk14, jcl, nop 等,他们实现了跟具体日志工具(比如 log4j)的绑定及代理工作。举个例子:如果一个程序希望用 log4j 日志工具,那么程序只需针对 slf4j-api 接口编程,然后在打包时再放入 slf4j-log4j12-version.jar 和 log4j.jar 就可以了。

现在还有一个问题,假如你正在开发应用程序所调用的组件当中已经使用了 JCL 的,还有一些组建可能直接调用了 java.util.logging,这时你需要一个桥接器(名字为 XXX-over-slf4j.jar)把他们的日志输出重定向到 SLF4J,所谓的桥接器就是一个假的日志实现工具,比如当你把 jcl-over-slf4j.jar 放到 CLASS_PATH 时,即使某个组件原本是通过 JCL 输出日志的,现在却会被 jcl-over-slf4j “骗到”SLF4J 里,然后 SLF4J 又会根据绑定器把日志交给具体的日志实现工具。过程如下

Component
   |
   | log to Apache Commons Logging
   V
 jcl-over-slf4j.jar --- (redirect) ---> SLF4j ---> slf4j-log4j12-version.jar ---> log4j.jar ---> 输出日志

看到上面的流程图可能会发现一个有趣的问题,假如在 CLASS_PATH 里同时放置 log4j-over-slf4j.jar 和 slf4j-log4j12-version.jar 会发生什么情况呢?没错,日志会被踢来踢去,最终进入死循环。

所以使用 SLF4J 的比较典型搭配就是把 slf4j-api、JCL 桥接器、java.util.logging(JUL)桥接器、log4j 绑定器、log4j 这5个 jar 放置在 CLASS_PATH 里。

不过并不是所有APP容器都是使用 log4j 的,比如 Google AppEngine 它使用的是 java.util.logging(JUL),这时应用 SLF4J 的搭配就变成 slf4j-api、JCL桥接器、logj4桥接器、JUL绑定器这4个 jar 放置在 WEB-INF/lib 里。

转载本文时请保留此出处链接:http://ivarptr.blogspot.com/2011/02/slf4j.html

评论

  1. 原来网上流传的文章都转载自这里,讲的很清晰,感谢。

    回复删除

发表评论

此博客中的热门博文

在家用PC里体验 FreeBSD 8.1(上)

F reeBSD ( http://www.freebsd.org/ ) 是一个开源免费的操作系统,最早接触FreeBSD是约7年前在 @hplcsz 挂bbs的服务器,后来很少关注了,最近接触到 Apple 的 MacOS 和 iOS (基于FreeBSD衍生出来的操作系统)联想起FreeBSD项目,才发现它已经更新到8.1版了。 恰好家里多出一台电脑暂时没有用,于是尝试用FreeBSD 8.1配置一台适合家用的电脑(用来看看新闻灌灌水的那种),于是有了如下一篇文章。 (注:这里假设读者已经有一定的Linux/BSD基础) 首先访问 FreeBSD 项目的官方网站,下载 FreeBSD 8.1的安装镜像文件( ftp://ftp.freebsd.org/pub/FreeBSD/releases/i386/ISO-IMAGES/8.1/ ),这里提供CD版、DVD版和U盘版,考虑到我有DVD刻录机,所以下载了DVD版。 下载过程是一个漫长的等待,期间强烈推荐阅读一下官方的《FreeBSD使用手册》(中文版,以下简称《使用手册》)( http://www.freebsd.org/doc/zh_CN.GB2312/books/handbook/index.html ),如果对Linux/BSD不是很熟悉,前3章是很有必要阅读的,否则会被折腾到2012年。等待DVD镜像下载完,大概已经看到第10章了。 1、安装 FreeBSD 8.1 刻录下载回来的DVD镜像文件,从光驱启动然后选择“Quick模式”即开始安装过程。结合《使用手册》一般没有多大问题,因为这篇文章重点是如何搭建家用PC的环境,所以具体的安装过程这里就省略了。小技巧: A、 FreeBSD 必须安装在主分区,在安装之前你必须腾出一个至少10来GB的主分区。 B、 当安装问你是否安装“Ports(相当于软件商店、软件中心)”时,要选择“YES”。 C、 当安装接近完成时,程序会问你 “Would you like to browse the collection now?“,这一步是问你是否安装DVD上附带的软件,选择Yes,然后把下面这两个大块头选中,这样能避免从网络下载桌面环境的安装文件,节省时间和网络流量,减低碳排放: + X11/xorg-7.5 + gnome/gnom

在家用PC里体验 FreeBSD 8.1(下)

在 上一章 讲到如何配置 gnome 桌面环境以及 firefox 浏览器,很快你会发现上网时不能播放 flash,这是因为 Adobe Flash 没有提供 FreeBSD 版本,为了运行这类没有开源只有编译好的 Linux 版程序,我们需要安装一个 Linux 二进制兼容包。[注1] 1、安装 Linux 二进制兼容包 为了确保安装顺利,最好把 FreeBSD Ports 更新一下。[注2] # portsnap fetch 第一次运行这个命令会下载最新的 Ports Collection,大概半小时左右下载完,然后展开安装文件: # portsnap extract 使用 portsnap update 命令更新已安装的 Ports: # portsnap update 这样更新就完成了。下面开始安装 Linux 二进制兼容包,[注3]先开启 Linux KLD 模块: #kldload linux 如果希望 Linux 兼容支持在系统初始化过程中自动启用,则应在 /etc/rc.conf 中增加: linux_enable="YES" 可以使用 kldstat 命令检查KLD模块是否已经加载成功(以百分号开头的命令表示可以用普通帐号操作,下同): % kldstat 如果看到 linux.ko 字样则表示加载成功。下面还要安装 Linux 运行时库, # cd /usr/ports/emulators/linux_base-f10 # make install distclean 这又是一个漫长的等待过程,运行完毕之后还要挂载 Linux 进程文件系统,使用如下命令: # mount -t linprocfs linproc /usr/compat/linux/proc 如果希望机器启动时自动挂载,需要在文件 /etc/fstab 里面加上这一行 linproc    /usr/compat/linux/proc  linprocfs   rw  0   0 2、安装浏览器 Flash 插件 [注4] 我们开始下载安装 Flash 的 Linux 版插件: # /usr/ports/www/linux-f10-flashplugin10 # make install c

全新 CentOS 5.5环境挂WordPress3

本文目标:在全新的 CentOS 5.5 (32位)里安装 1、apache 2.2+ 2、mysql 5.1+ 3、php 5.3+ 4、wordpress 3 + 安装 apache, mysql, php apache 2 可以使用 yum 安装。 而 mysql 和 php 由于CentOS源的版本太旧了,所以需要添加另外一个源。这里选用的是 REMI 源,直接下载这个rpm包: http://rpms.famillecollet.com/enterprise/remi-release-5.rpm 安装这个包然后就可以安装 httpd和php了 yum --enablerepo=remi install httpd php php-common 安装php5的附加模块 yum --enablerepo=remi install php-pear php-pdo php-mysql php-pgsql php-pecl-memcache php-gd php-mbstring php-mcrypt php-xml 启动httpd服务之后,在 /var/www/html 里创建一个PHP测试文件比如 test.php,里面写入如下内容 <?php phpinfo(); ?> 浏览一下这个页面 http://localhost/test.php,如果出现PHP测试页面的话就说明 apache 和 php 已经安装成功了。 安装mysql yum --enablerepo=remi install mysql 安装完毕之后登录到 mysql 创建一个名字为 blog 的数据库,添加一个访问帐号。 安装 wordpress 下面开始安装 wordpress 了,首先到官网下载最新版的 wordpress ,然后解压到  /var/www ,要注意因为 apache 会以 root 帐号权限运行,所以为了减少麻烦,最好切换到 root 帐号再做刚才的解压操作以及下面的所有步骤。解压之后形成 /var/www/wordpress 目录,然后把该目录下面的 wp-content 添加其他人写入权限,即 chmod o+w wp-content 因为这个目录是用来存放主题、上传附件等可变