最近在做一个集成,据说 log4j.xml 做日志配置文件将是个趋势。故采用log4j.xml做日志配置
在我的项目开发中,我想看到
【1】. hibernate的详细输出日志;
【2】. struts2(实际上是xwork 2.1.1版本)的输入日志:debug 级别时,可以看到页面的传入参数;
【3】. json插件 (jsonplugin-0.30.jar) debug 级别时,输出生成的json字符串,便以查看;
【4】. 连接池c3p0 (c3p0-0.9.1.2.jar) debug 时,随时查看连接池基本信息。
不输出其他日志。
说明:xwork 版本,xwork-2.1.1以及以上版本 自己实现了log日志(基于org.commons.logging),而xwork-2.0.6以及以下版本则直接采用的是org.commons.logging日志(猜的,比版本2.1.1少logging包);
页面输入参数和值由类:com.opensymphony.xwork2.interceptor.ParametersInterceptor debug时输出;
json输出字符串由类 com.googlecode.jsonplugin.JSONUtil 输出;
连接池基本信息:com.mchange.v2.resourcepool.BasicResourcePool输出;
之前使用log4j.properties,出现日志 【1 】 【2】【3】【4】;
重新搭建项目引入spring2.5等其他,改成log4j.xml配置,出现日志【1】【4】。(不过最后多次试验发现原来是commons-logging版本之间问题)
查看其源代码发现
1.hibernate log4j日志采用了 slf4j-api 接口实现 兼容 log4j.xml和log4j.properties;
2. xwork-2.1.1基于org.commons.loging 实现了自己的日志,如果没有commons-logging包,就采用java.util.logging;
3.json插件 则直接采用的是org.commons.loging
4.c3p0日志也是自己实现,比较复杂 。支持 log4j.xml和log4j.properties,不受commons-logging版本影响
为了实现我的【2】【3】目标 (【1】【4】已经可以),我修改了xwork的日志实现方法,改成基于slf4j实现,本身就是工厂模式实现,所以改动量比较小(改之后,不支持级别fatal)。对于【3】 只能修改每个java文件,幸好文件不多(最后发现只要换其他commons-logging版本)。
总结:
commons.loging ---->>使用 commons-logging-api-1.1.jar,版本太新,无法显示xwork-2.1.1 日志。包括spring2.5.5版本的日志,选择使用commons-logging-1.0.4.jar 可以显示。
log4j--->>log4j.xml 和log4j.properties
slf4j --->>>log4j.xml和log4j.properties 更多,需要对应的日志版本,如果没有会出错提示;
以后开发项目中采用slf4j-api 做记录日志,因为兼容多种日志,相关的jar包有
slf4j-api-1.5.0.jar,slf4j-api-1.5.2.jar,slf4j-log4j12-1.5.0.jar(和log4j就有关),slf4j-jdk14-1.5.2.jar(和java.util.logging有关)。
对于slf4j的介绍如下(搜索到的)
SLF4J不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。
实际上,SLF4J所提供的核心API是一些接口以及一个LoggerFactory的工厂类。从某种程度上,SLF4J有点类似JDBC,不过比JDBC更简单,在JDBC中,你需要指定驱动程序,而在使用SLF4J的时候,不需要在代码中或配置文件中指定你打算使用那个具体的日志系统。如同使用JDBC基本不用考虑具体数据库一样,SLF4J提供了统一的记录日志的接口,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过具体日志系统的配置来实现,因此可以在应用中灵活切换日志系统。
1、什么情况可以使用
如果你开发的是类库或者嵌入式组件,那么就应该考虑采用SLF4J,因为不可能影响最终用户选择哪种日志系统。在另一方面,如果是一个简单或者独立的应用,确定只有一种日志系统,那么就没有使用SLF4J的必要。假设你打算将你使用log4j的产品卖给要求使用JDK 1.4 Logging的用户时,面对成千上万的log4j调用的修改,相信这绝对不是一件轻松的事情。但是如果开始便使用SLF4J,那么这种转换将是非常轻松的事情。
简单的说 slf4j 就是兼容各种日志,对应开发者来说,使用slf4j和使用commons.loging 或log4j是一样的,只是导入不同的类
--wayfoon