Log in Spring

时间:2022-02-02 08:30:12

记录日志向来是企业级应用程序必须考虑的事情。早些年,一个项目一个日志功能或模块,然后有了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&lt ...

  5. Spring事务

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

  6. WebApplicationInitializer &lpar;spring 3&period;x&period;x以上版本&rpar;

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

  7. Spring相关

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

  8. &lbrack;Spring框架&rsqb; Spring中的 ContextLoaderListener 实现原理&period;

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

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

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

随机推荐

  1. 使用Spark分析拉勾网招聘信息&lpar;一&rpar;&colon;准备工作

    本系列专属github地址:https://github.com/ios122/spark_lagou 前言 我觉得如果动笔,就应该努力地把要说的东西表达清楚.今后一段时间,尝试下系列博客文章.简单说 ...

  2. Android 利用Application对象存取公共数据

    本文章来给大家介绍Android 利用Application对象存取公共数据. Android系统在运行每一个程序应用的时候,都会创建一个Application对象,用于存储与整个应用相关的公共变量. ...

  3. xcode插件——新建cocos2dx工程

    个人制作的一个创建cocos2dx工程的xcode小插件 按照readme安装一下即可. 创建工程后,将自动弹出finder到工程目录. 弹出窗口:

  4. 2个2D向量计算交点的夹角和补角

    2维向量如何计算与某一个交点之间的夹角,假设A,B是向量,C是他们共同连接的一个点计算出A-C-B形成的角度   我们先了解几个简单的计算: 2D向量的乘积计算 (A.x * B.x + A.y * ...

  5. git下载Ardupilot源码

    pwd #确定当前目录 mkdir Copter-3.5.4 #如有需要,新建目录 cd Copter-3.5.4 #进入新目录文件 #克隆指定分支,并且克隆分支对应的git子模块 git clone ...

  6. ORM对象关系映射之GreenDAO自定义属性转换器PropertyConverter

    在使用GreenDAO定义实体的属性时候,通常来说定义的实体属性名就是对应的表的字段名.实体中属性的类型(如Long.String等)就是表的字段名类型,但是我们难免会有不一样的需求,比如实体中我定义 ...

  7. 使用 MapTiler 进行地图切片

    在GIS开发中接触比较多的就是切图与发布,通常大家使用的是GlobalMapper.ArcGIS.GDAL等. 一般在使用Leaflet.js或其他框架开发时,使用的是TMS切片格式,大佬们基本用GD ...

  8. 洗礼灵魂,修炼python(87)-- 知识拾遗篇 —— 线程(1)

    线程(上) 1.线程含义:一段指令集,也就是一个执行某个程序的代码.不管你执行的是什么,代码量少与多,都会重新翻译为一段指令集.可以理解为轻量级进程 比如,ipconfig,或者, python   ...

  9. java爬取网站信息和url实例

    https://blog.csdn.net/weixin_38409425/article/details/78616688(出自此為博主) 具體代碼如下: import java.io.Buffer ...

  10. DELPHI 对象的本质 VMT

    http://www.cnblogs.com/little-mat/articles/2206627.html TObject是所有对象的基本类,DELPHI中的任何对象都是一个指针,这个指针指明该对 ...