记录日志向来是企业级应用程序必须考虑的事情。早些年,一个项目一个日志功能或模块,然后有了log4j这样的产品。不知是log4j将记录日志做到了极致,或是技术含量不高,又或是经济利益不明显,它已成为了这个方面最主要的实现者。它的地位形成了一个事实,其它日志工具与它共存时,大家会很自觉地调用它来完成实际的工作。在使用spring的过程中,这个机制刚开始会让程序员有些迷惑,至少我是这样的。spring官网改版前提供jar包下载,现在是通过maven或gradle在线下载jar包。在spring framework里,日志工具是common-logging。在spring data jpa里,日志工具变成了slf4j,它需要两个包:jcl-over-slf4j和slf4j-api。事情并没有结束,因为项目还需要hibernate。从hibernate4开始,它的日志工具变成了jboss-logging,为了支持i18n。现在项目工程的lib文件夹里已经有了4个jar包来支持记录日志的工作,即便如此,我们除了能在控制台输出上看到相关信息外,并不能对这些日志工具进行配置从而将日志内容记录到文件或数据库里进行持久化存储。到官网(确保正确性)上查看资料,我们才会发现这些工具都是facade,只提供最simple或default的日志记录功能,要想进行扩展,必须集成log4j这样的产品。对于common-logging和jboss-logging,把log4j的jar包跟它们放在一起,这两个工具就能自动集成log4j了;对于slf4j,还需要外加一个slf4j-log4j的jar包。在spring的文档中有这样几句话:If we could turn back the clock and start Spring now as a new project it would use a different logging dependency. The first choice would probably be the Simple Logging Facade for Java (SLF4J), which is also used by a lot of other tools that people use with Spring inside their applications.SLF4J is a cleaner dependency and more efficient at runtime than commons-logging because it uses compile-time bindings instead of runtime discovery of the other logging frameworks it integrates.好吧,时间是不可能倒退的,我们只能靠自己完成配置以使用slf4j。jboss-logging实现的也是“运行时发现算法”(runtime discovery algorithm),会有什么问题?随它去吧!common-logging是jcl标准接口的实现,所以jcl-over-slf4j是jcl与slf4j之间的桥梁,有了jcl-over-slf4j,spring还以为自己仍然在调用common-logging。之后,slf4j-api调用slf4j-log4j的接口去使用真正的log4j。使用log4j确实简单,把配置文件放到classpath下就行了,如果是eclipse的目录结构,就是放到src文件夹里。配置文件的内容由三个部分组成:logger、appender和layout,理解起来也很容易,网上资料太多在这里就不重复了。

最后可以总结出我们的日志工具所需要的jar包:jcl-over-slf4j、slf4j-api、slf4j-log4j、log4j、jboss-logging。除了日志工具的纠结外,这些优秀的框架在java字节码操作和动态代理方面也是盘根错节的。就目前的发行版来看,hibernate从cglib更改为了javassist,spring3.2后就直接集成了cglib+asm,好像以前是集成在一起的,后来分开了(需要单独添加jar包),现在又在一起了,真是折腾啊!这次在一起后,spring在动态代理方面威力巨大,既可以实现接口代理(jdk支持)又可以实现类代理(cglib支持)。

Log in Spring的更多相关文章

  1. 深入分析Spring 与 Spring MVC容器

    1 Spring MVC WEB配置 Spring Framework本身没有Web功能,Spring MVC使用WebApplicationContext类扩展ApplicationContext, ...

  2. spring mvc DispatcherServlet详解之前传---FrameworkServlet

    做项目时碰到Controller不能使用aop进行拦截,从网上搜索得知:使用spring mvc 启动了两个context:applicationContext 和WebapplicationCont ...

  3. spring源码:web容器启动(li)

    web项目中可以集成spring的ApplicationContext进行bean的管理,这样使用起来bean更加便捷,能够利用到很多spring的特性.我们比较常用的web容器有jetty,tomc ...

  4. Spring MVC 学习 -- 创建过程

    Spring MVC 学习 -- 创建过程 Spring MVC我们使用的时候会在web.xml中配置 <servlet> <servlet-name>SpringMVC< ...

  5. Spring事务

    1.@Transactional 只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能.@Transactional 的 ...

  6. WebApplicationInitializer (spring 3.x.x以上版本)

    实现WebApplicationinitializer接口的类都可以在web应用程序启动时被加载. 那么来想一个问题:为什么实现了WebApplicationInitializer这个接口后,onSt ...

  7. Spring相关

    一.Spring中ApplicationContext加载机制加载器目前有两种选择:ContextLoaderListener和ContextLoaderServlet. 这两者在功能上完全等同,只是 ...

  8. [Spring框架] Spring中的 ContextLoaderListener 实现原理.

    前言: 这是关于Spring的第三篇文章, 打算后续还会写入AOP 和Spring 事务管理相关的文章, 这么好的两个周末 都在看code了, 确实是有所收获, 现在就来记录一下. 在上一篇讲解Spr ...

  9. 从启动日志看Spring IOC的初始化和Bean生命周期

    一.Tomcat中启动IoC容器的日志 启动Tomcat等容器时,控制台每次都打印出一些日志. 最近刚好在研究Spring源码,所以换个角度,从启动日志来简单的看看Spring的初始化过程! 以下是T ...

随机推荐

  1. windows下用c实现Socket通信

    原文:windows下用c实现Socket通信 原本以为c是跨平台,所以,c在windows下和linux下的程序应该是类似于Java,什么都不用改变的,今儿才恍然大悟,他们的类库不一样啊-- 下面我 ...

  2. 几个常用的CSS3样式代码以及不兼容的解决办法

    原文:几个常用的CSS3样式代码以及不兼容的解决办法 border-radius实现圆角效果 CSS3代码: -webkit-border-radius:10px; -moz-border-radiu ...

  3. MVC5+ 路由特性

    MVC5+ 路由特性 概述 ASP.NET MVC 5支持一种新的路由协议,称为路由特性. MVC5也支持以前定义路由的方式,你可以在一个项目中混合使用这两种方式来定义路由. 案例 1.使用Visua ...

  4. Docker运行 Mono

    Docker运行 Mono Docker 是最近相当热门的一个名词,它是一个基于 Linux Container 的轻量化的虚拟技术,而微软也相当积极与 Docker 合作,在 Azure 上支持这个 ...

  5. Spring Resource之ResourceLoader

    ResourceLoader接口意味着任何实现的对象都能够返回Resource实例. public interface ResourceLoader { Resource getResource(St ...

  6. css3动画实例测试

    1.css3动画属性分析(2016-5-11) 1.transition: 规定属性变换规则,可以这样讲.transition(a,b,c,d); a:要变换的属性: b:过渡时间: c:运动方式: ...

  7. Android项目---TouchListener

    public static interface View.OnTouchListener android.view.View.OnTouchListener Known Indirect Subcla ...

  8. Android: 自定义Tab样式,一种简单的方式。

    之前看到过论坛里已经有人发过自定义Tab样式的帖子,感觉有些复杂了,这里分享个简单的方法. 1.制作4个9patch的tab样式,可参考android默认的资源 tab_unselected.9.pn ...

  9. NhibernateProfiler-写个自动破解工具(源码)

    04 2013 档案   [屌丝的逆袭系列]是个人都能破解之终结NhibernateProfiler-写个自动破解工具(源码) 摘要: 破解思路分析及手动破解 增加“附加到进程”功能--功能介绍增加“ ...

  10. 如何用VB获得Windows各类系统目录

    现在有很多关于如何用VB获得Windows目 录的文章,但大都只讲到如何获得Windows目录和System目录,有时候我们却需要获得像"我的文档"这样的目录("我的文档 ...