【日志】Java 流行框架(Spring/Struts2/Hibernate/iBatis)都在使用什么日志组件

转载 2015年11月20日 10:41:21

做 Java Web 应用我想多会采用这两种框架组合,SSH 和 SSI,其实我是不太喜欢用这两种缩写方式:

SSH = Spring + Struts + Hibernate,SSH 由久已久所代表的是 Secure Shell,像 https
SSI = Spring + Struts + iBatis,SSI 在很久以前就是 Server Side Include,像 shtml,而 iBatis 已更名为 MyBatis 了。

要是在以往做这样的 Java 项目都会用 Commons-Logging + Log4J 来作为日志框架,因为多数组件用的是 Common-Logging 通用组件,而那时 Log4J 控制实际的日志输出也是最强的。

现在的情况可有些不同了,所以为 SSH 和 SSI 选用哪种日志框架组合还得看最新的核心组件用的是什么日志。所以要分析下 Spring(最新版 3.0.4)、Struts2(最新版 2.2.1,不讨论 Struts1了)、Hibernate(最新版 3.6.0 Final)、iBatis(应该考虑 MyBatis,iBatis 最后版为 3.0,MyBatis 的最新版是 3.0.2),它们用的是什么通用日志实现,其他的外围组件一般就跟着转了,无外乎就是 Commons-Logging 或 Slf4J 了。下面逐一来看看:

Spring 3.0.4:走的还是它的一贯路线,坚持使用 Commons-Logging,它的类中的代码是:

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

protected transient Log logger = LogFactory.getLog(getClass());

Struts 2.2.1:它承袭的是 WebWork 的衣钵,它从代码希望做到与 Commons-Logging 解耦,所以在包中声明了自己的 Logger 和 LoggerFactory,且看:

import com.opensymphony.xwork2.util.logging.Logger;
import com.opensymphony.xwork2.util.logging.LoggerFactory;

Logger log = LoggerFactory.getLogger(FilterDispatcher.class);

而在 com.opensymphony.xwork2.util.logging.LoggerFactory 中,首先会使用 Commons-Logging 的实现:

Class.forName("org.apache.commons.logging.LogFactory");
factory = new com.opensymphony.xwork2.util.logging.commons.CommonsLoggerFactory();

这样的写法,从代码上不会依赖于 Commons-Logging 了。

Hibernate 3.6.0:Hibernate 是 Slf4J 的追随者,从 3.3 开始直接改用 Slf4J 了,代码中:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

private static final Logger log = LoggerFactory.getLogger(ConfigHelper.class);

iBatis,以 MyBatis 3.0.2 为例:它与 Struts2 的做法如出一辙,对照一下代码:

import org.apache.ibatis.logging.Log;
import org.apache.ibatis.logging.LogFactory;

private static final Log log = LogFactory.getLog(LoggingCache.class);

也是把 Log 和 LogFactory 写到自己的类中来,再看 org.apache.ibatis.logging.LogFactory 的实现:

它优先考虑的也是 Slf4J,显然它看重的也是 Slf4J。

static {
    tryImplementation(new Runnable() {
        public void run() {
            useSlf4jLogging();
        }
    });
        ...下面代码类似的,依次是...
        useCommonsLogging();
        useLog4JLogging();
        useJdkLogging();
        useNoLogging();
}

本来起草是本文的标题是:在 SSH 或 SSI 项目中应该选用 Slf4J+Logback 作为日志框架,可是写到这里似乎不那么妥了,所以改成了 Java 流行框架(Spring/Struts2/Hibernate/iBatis)都在使用什么日志组件。因为再继续具体的说怎么在这样的项目中使用 Slf4j+LogBack 还是 JCL + Log4J 就找不到重点了。

前面从代码中分析了当前最流行的四种 Java 框架分别用的是什么日志组件,再小结一下:

Spring 3.0.4:Commons-Logging
Struts 2.2.1:间接的优先支持 Commons-Logging
Hibernate 3.6.0:直接的使用 Slf4J
iBatis/MyBatis 3.0.2:间接的优先使用 Slf4J

从中我们可以隐约的感觉到 Slf4J 是一种向前发展的趋势,Log4J 的作者开发了与 Slf4J 对接的,作为 Log4J 替代品的 Logback。在我看来要用 Slf4J 就应该考虑 Slf4J + Logback 的组合,再用 jcl-over-slf4j 把 Commons-Logging 与 Slf4J 桥接起来。用 Logback 取代 Log4J 的实际日志输出功能,即有 Commons-Logging 和 Slf4J 混杂的情况下用:

Slf4J + Logback
jcl-over-slf4j + Logback

把 Java Commons-Logging 也转到 slf4J 最终也用 Logback 输出日志。

而不是用

JCL + Log4J
Slf4J + Log4J

全部直接转到 Log4J 来输出日志,看起来似乎要简单些,但实际上是两种通用日志框架在各行其事,JCL 那部分是体验不到 Slf4J 新的快感的。也无法明白 Log4J 的作者为何会重新开出一个 Logback 来替换 Log4J。

看我前面写过的一篇:SLF4J 的几种实际应用模式--之二:SLF4J+Logback,其中提到了下面的理由:

Logback 替代 Log4J 的十几个理由:Reasons to prefer logback overlog4j,说的大至是更快;好测试;与 SLF4J 关系紧;文档丰富;能自动加载配置文件;多个 JVM 写一个日志文件,或其他 I/O 错误时不影响程序执行;配置文件中加入条件控制;强大的日志过滤;更强的日志切分功能;自动压缩、删除日志文件;异常栈更多的数据信息。

Java 流行框架(Spring/Struts2/Hibernate/iBatis)都在使用什么日志组件

做 Java Web 应用我想多会采用这两种框架组合,SSH 和 SSI,其实我是不太喜欢用这两种缩写方式: SSH = Spring + Struts + Hibernate,SSH 由久已久所代...
  • lidawei201
  • lidawei201
  • 2013年01月17日 15:15
  • 3207

Java 流行框架(Spring/Struts2/Hibernate/iBatis)都在使用什么日志组件

做 Java Web 应用我想多会采用这两种框架组合,SSH 和 SSI,其实我是不太喜欢用这两种缩写方式: SSH = Spring + Struts + Hibernate,SSH 由久已久...
  • pengchenghui
  • pengchenghui
  • 2017年03月24日 13:25
  • 161

数据库持久层框架iBatis、myBatis、Hibernate对比

在 java 应用的数据库开发中,不可避免地会使用到持久层框架,而现在开源项目中持久层框架用到最多的基本就是 iBatis、myBatis 和 Hibernate 了。这里就重点分析下这三个框架之间的...
  • nicolas_huan
  • nicolas_huan
  • 2017年03月28日 10:38
  • 1734

Hibernate学习:slf4j日志框架

一:首先来看一个图 commons-logging和slf4j都是日志的接口,供用户使用,而没有提供实现!后面的log4j,slf4j-nop等才是他们的实现。 ...
  • u013628152
  • u013628152
  • 2015年02月05日 22:06
  • 1457

Java日志框架介绍

概述 在刚接触日志框架时,被很多日志框架搞的头晕,下面将整体介绍下当前流行的开源日志框架,并重点介绍log4j的日志输出原理及配置指导 日志框架 简介 参考 JUL JDK自带日志框架(j...
  • junefsh
  • junefsh
  • 2015年02月28日 16:49
  • 956

Java中常用的两个ORM框架:Hibernate和iBatis

出处:http://wing011203.cnblogs.com/ 这篇文章里,我们主要讨论ORM框架,以及在使用上和JDBC的区别。   概述   ORM框架不是一个新话题,它已经流传了很多...
  • fengqiaojiangshui
  • fengqiaojiangshui
  • 2017年04月13日 16:59
  • 620

基于struts2的日志管理系统

既然是基于struts2框架做的,就必须了解struts框架。struts详解:http://baike.baidu.com/link?url=thjh0ktwQ5cQhzKnUVmSdIqXicPU...
  • HsuanlinMagic
  • HsuanlinMagic
  • 2016年09月19日 20:46
  • 1782

java日志组件的介绍

common-logging common-logging是apache提供的一个通用的日志接口。用户可以自由选择第三方的日志组件作为具体实现,像log4j,或者jdk自带的logging, c...
  • zj972535075
  • zj972535075
  • 2015年06月23日 23:13
  • 647

Struts2+Spring+Hibernate 三大框架的合并集成

这次来看看Struts2+Spring+Hibernate三大框架的整合应用,主要是Spring和Hibernate框架的整合,因为前边已经将Strtus2+Spring整合过了基本一样。    ...
  • liujiahan629629
  • liujiahan629629
  • 2014年03月19日 22:57
  • 35890

struts2+spring+hibernate框架总结(框架分析+环境搭建+实例源码下载)

首先,SSH不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活、易于扩展的多层Web应用程序。   ...
  • showbaba3
  • showbaba3
  • 2015年10月03日 12:15
  • 3136
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【日志】Java 流行框架(Spring/Struts2/Hibernate/iBatis)都在使用什么日志组件
举报原因:
原因补充:

(最多只允许输入30个字)