Log in Spring
记录日志向来是企业级应用程序必须考虑的事情。早些年,一个项目一个日志功能或模块,然后有了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的更多相关文章
- 深入分析Spring 与 Spring MVC容器
1 Spring MVC WEB配置 Spring Framework本身没有Web功能,Spring MVC使用WebApplicationContext类扩展ApplicationContext, ...
- spring mvc DispatcherServlet详解之前传---FrameworkServlet
做项目时碰到Controller不能使用aop进行拦截,从网上搜索得知:使用spring mvc 启动了两个context:applicationContext 和WebapplicationCont ...
- spring源码:web容器启动(li)
web项目中可以集成spring的ApplicationContext进行bean的管理,这样使用起来bean更加便捷,能够利用到很多spring的特性.我们比较常用的web容器有jetty,tomc ...
- Spring MVC 学习 -- 创建过程
Spring MVC 学习 -- 创建过程 Spring MVC我们使用的时候会在web.xml中配置 <servlet> <servlet-name>SpringMVC< ...
- Spring事务
1.@Transactional 只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能.@Transactional 的 ...
- WebApplicationInitializer (spring 3.x.x以上版本)
实现WebApplicationinitializer接口的类都可以在web应用程序启动时被加载. 那么来想一个问题:为什么实现了WebApplicationInitializer这个接口后,onSt ...
- Spring相关
一.Spring中ApplicationContext加载机制加载器目前有两种选择:ContextLoaderListener和ContextLoaderServlet. 这两者在功能上完全等同,只是 ...
- [Spring框架] Spring中的 ContextLoaderListener 实现原理.
前言: 这是关于Spring的第三篇文章, 打算后续还会写入AOP 和Spring 事务管理相关的文章, 这么好的两个周末 都在看code了, 确实是有所收获, 现在就来记录一下. 在上一篇讲解Spr ...
- 从启动日志看Spring IOC的初始化和Bean生命周期
一.Tomcat中启动IoC容器的日志 启动Tomcat等容器时,控制台每次都打印出一些日志. 最近刚好在研究Spring源码,所以换个角度,从启动日志来简单的看看Spring的初始化过程! 以下是T ...
随机推荐
- 从Access创建Sqlite数据库
首先,我们需要使用SQLite Expert Professional 工具 1.创建一个新的数据库 2.由SQLite Expert创建数据库.然后import --〉Data Transfer W ...
- 电脑报2014年第43期 pdf高清版
电脑报2014年第43期 pdf高清版
- 我的时间,GTD做主
可能每一次总结的时候,我们都在努力的回顾,我这几天都干了什么,结果回顾半天得到的结果就是:我也不知道,仿佛什么都没有做似的.事实上不然,你已经做了好多事,但却始终有这样的感觉,有的时候都在自己发问:我 ...
- 超高性能的json序列化
超高性能的json序列化之MVC中使用Json.Net 超高性能的json序列化之MVC中使用Json.Net 先不废话,直接上代码 Asp.net MVC自带Json序列化 1 /// <su ...
- POJ 2114 Boatherds 划分树
标题效果:鉴于一棵树,问有两点之间没有距离是k的. 数据的多组 思维:和IOI2011的Race喜欢.不是这么简单.阅读恶心,我是在主要功能的别人的在线副本. CODE: #include <c ...
- ie6、ie7真的不支持inline-block吗?
本来今天想出JavaScript继承的博文的,由于也才刚学习不久,以及工作比较忙,所以暂推两天写JavaScript的继承,喜欢的童鞋们关注我的博客哟! okay,言归正传.之前在接触前端的时候,处理 ...
- php操作xml并插入到数据库中
php操作xml并插入到数据库中 <? php header('content-type:text/html;charset=utf-8'); mysql_connect('localhost' ...
- android简单的计算器
所使用的算法:表达式求值(中缀表达式转后缀表达式,后缀表达式求值值) 不如何设计接口,有时间来美化! MainActivity.java package com.example.calculator; ...
- 纯Lambda实现斐波那契数列
还需要考虑溢出等问题,主要无事写着玩 Func<float, float, float> a = (arg1, arg2) => 0f;//init ; a = (lastNumbe ...
- Sql Server 主键由字母数字组成并按照数字自动增长
在SQL SERVER 中如果我们想要使主键按照一定规则自动增长我们可以这样做: 这里我们新建一张研究表,里面有研究ID,研究人员姓名和研究医院. 我们使SicentificId 设为主键 并且从1开 ...