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 ...
随机推荐
- C--控制语句循环例子
C的三种循环while.for和do while 先说一下scanf()函数的返回值问题 当scanf("%d,%d",&a,&b);如果用户正确输入了俩个整形变 ...
- mysqldump报错
在使用mysqldump命令备份整个数据库的时候,报错例如以下: mysqldump: Couldn't execute 'SHOW TRIGGERS LIKE 'userlog'': Got err ...
- mono for android 学习记录
C#开发Android应用实战(全 扫描 中文版) 学习记录: 拖完控件后,不要急着按F5,需要重新生成,才能自动修改 Resource.Designer.cs 文件 1. Activity 是基于a ...
- iOS发展 - 使用您自己的自定义字体
一位同事问我最后一次,XXapp字体如何萌啊? 我也想提出萌哒哒的字体!然后,今天有这blog. 首先,我们正处于iOS发展,苹果给了我们很多的字体,当然,我就不一一列举在这里,英文,小汤表示看不懂啦 ...
- SURF分析算法
SURF分析算法 一个.整体形象 这个概念是积分图像Viola和Jones建议.随机位积分图像(i.j)的值原始图象的左上角随机点(i,j)级配相应的重点领域值的总和,其数学公式如图1所看到的 ...
- Android Material Design带UI变化
谷歌Matias Duarte称,"Material Design是漂亮和大胆的.由于干净的排版和布局简单且easy理解.内容才是焦点. 谷歌I/O 014开发人员大会上宣布全新的设计语言& ...
- CSS3 选择器读解
文章资料来自于W3Cfuns CSS3.0 四个基本的结构性伪类选择器:root 此选择器将绑定到页面的根元素中,所谓根元素,是指文档树中最顶层的元素,也就是<html>部 分. < ...
- POJ 1201 && HDU 1384 Intervals(差动制动系统)
职务地址:POJ 1201 HDU 1384 依据题目意思.能够列出不等式例如以下: Sj-Si>=c; Si-S(i-1)>=0; S(i-1)-Si>=-1; 然后用最短路s ...
- sql点滴42—mysql中的时间转换
原文:sql点滴42-mysql中的时间转换 UNIX时间戳转换为日期用函数: FROM_UNIXTIME() select FROM_UNIXTIME(1156219870); 日期转换为UNIX时 ...
- Spring IOC之容器概述
1.SpringIOC容器和beans介绍 IOC的依赖注入是这样的,对象定义他们的依赖也就是他们需要在一起起作用的对象是通过构造器参数以及工厂方法的参数或者是当他们被构建或者是从工厂中返回时设置在对 ...