`
deepnighttwo
  • 浏览: 49816 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java Log 系统介绍以及切换

阅读更多

Java的log系统比较繁杂。在这里梳理一下。本文只涉及log系统介绍和处理log系统之间的切换。不涉及如何配置和使用。

 

具体的log系统

Log4j:准确的说是log4j 1.x版。是之前使用最广泛的log系统。

Logback:Log4j的作者另立炉灶写的新版log,比起log4j性能更好。具体的对比可以参考http://www.oschina.net/translate/reasons-to-prefer-logbak-over-log4j 

JUL:Java Util Logging,是java 1.4以来自带的一个logging系统。相信用的人应该不多吧……

 

以上三个log系统是实打实的做事情的log系统,需要相应的配置来制定如何处理log等。

 

Log Facade系统

实际情况下,一个项目可能不想具体依赖于一种具体的log系统(比如log4j)。尤其是对于开源的中间件,类库等。如果一个开源的类库在代码里写了用log4j,那所有用到这个类库的代码都必须跟log4j扯上关系了(注意,没说必须要用log4j哦,后文会涉及y)。

更可能的是,应用依赖的类库有的用log4j,有的用logback,局面就会比较混乱。这会让应用无法方便的统一管理log系统。

 

应运而生的就是下面要介绍的这种log facade组件。或者说是一个bridge,一个包装,一个adapter……总之是做于log落地无关的事情的。它的作用就是将代码和log系统隔离,提供一个统一的接口,然后把log请求adapter到具体的log实现系统(上文中提到的)。

JCL:又叫做Common Logging,apache common logging,Jakarta Commons Logging。都是一个东西。

SLF4j:Simple Log Facade 4 Java。这个系统是log4j,logback的作者实现的。

 

SLF4j+logback

在具体的项目中,slf4j+logback是个不错的搭配。简单介绍一下这个组合。slf4j是个门面,在具体的代码中,它会尝试加载org.slf4j.impl.StaticLoggerBinder这个类。然后通过这个类的方法创建LogFactroy,以及各种log。所以StaticLoggerBinder就是连接slf4j和具体实现的桥梁。每种具体的实现,都要提供一个StaticLoggerBinder,来让slf4j找到具体的实现。

 

动态绑定/加载实现

logback和log4j都提供了StaticLoggerBinder(毕竟是一个人做的嘛……)。如果使用logback,就需要在cp里加入logback-classic(外围+扩展,StaticLoggerBinder就在这里面),logback-core(核心)。如果使用log4j,就需要slf4j-log4j12(版本即log4j的版本)。当然还少不了slf4j的jar包slf4j-api。

 

这样的话,应用程序中就只会引入slf4j的类。而具体实现则是slf4j负责打理的(加载Binder,Binder会负责触发log系统初始化等)。应用和具体的log系统就解绑了。类库使用了slf4j之后,就不必担心自己的选择会影响应用了。应用如果把log4j的相关jar包放在cp里,那就会是使用log4j。同样也可以使用logback。

 

如果cp里有多个Binder,就可能会看到如下的错误提示:

SLF4J: Class path contains multiple SLF4J bindings.

SLF4J: Found binding in [jar:file:/D:/Users/mzang/.m2/repository/org/slf4j/slf4j-log4j12/1.7.5/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: Found binding in [jar:file:/D:/Users/mzang/.m2/repository/ch/qos/logback/logback-classic/1.0.13/logback-classic-1.0.13.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]

 

p.s. Common Logging和slf4j异曲同工,只是具体实现方式不同。

 

更麻烦的事——切换Log系统

如果上面的东西还好理解,那么下面的事情就有点搞了。

在实际情况下,可能我们会有这样的需求。一个组件使用了log4j/jul/common log。但是我们想统一到使用slf4j + logback。举例来说,如果我们的应用一直用slf4j,结果引入的一个新类库使用了common logging。比较好的处理方式是让slf4j接替 common logging。或者说,让请求都落到slf4j上。

 

jcl-over-slf4j这个包可以完成这个任务。具体的步骤是,把common logging的jar包从cp里删掉,然后把jcl-over-slf4j放入cp。这个jar包中的类和common logging中的类名,方法名等完全一样,只是在具体的方法中,把所有的请求都暗渡陈仓的转移到了slf4j上。

 

同样还有log4j-over-slf4j,可以解决在代码中写了使用log4j的情况。只要用这个jar包替代log4j的jar包就可以了(还有一些细节,比如,如果程序中显示的调用了log4j中的一些类,appender什么的,那就没办法了,如果是规规矩矩的使用log4j.properties,那就没啥大问题)。

 

对于jul就复杂一点,因为不能把java中自带的类删了。所以jul-to-slf4j的做法是用自己的Hander(JUL处理日志的接口)作为root,同时删除所有的其它logger。这样就相当于用个二传手把所有的log通过这个硬塞进来的Handler,委托给了slf4j,然后slf4j再寻找实现,bulabula就跟前面一样了。

 

slf4j官网上有一个关于这方面的系统阐释。主要就是这个图。我尝试加了一下中文注释:

原地址:http://www.slf4j.org/legacy.html


 

那一大段话:

这个图展示了出于方便和权宜之下,所有可能的重定向和绑定。重定向只有在必须的时候才做。比如说,把jul重定向到slf4j,但是系统中又根本没用到jul,这样的重定向是没意义的。

 

总结一下:

负责提供slf4j绑定的jar包:

slf4j-log4j12

slf4j-jdk14

logback-classic

他们需要和具体的、对应的、版本一致的实现同时出现在cp中。

 

负责重定向到slf4j的:

jcl-over-slf4j

log4j-over-slf4j

jul-to-slf4j

 

他们需要替换掉原来的log系统的jar包(jcl和log4j),或者需要初始化一下(jul-to-slf4j)

  • 大小: 177 KB
0
0
分享到:
评论

相关推荐

    Java自定义日志模块实现

    比如,在某一项目开始时使用的是“log4j”框架,后面经过研究发现“sf4j”框架功能更强大,想切换到“sf4j”。常规的做法是,修改项目中每一处调用到“log4j”相关模块的代码。如果是项目比较大,所要花费的工作量...

    M-LOG 博客系统 v1.3

    M-LOG是一个用Java搭建的博客程序。该程序使用JDK1.5+、Spring MVC、Hibernate、Freemarker、Lucene搭建。 应用功能: 支持mateweblog离线写作协议 支持RSS2.0、Atom订阅功能 支持相册功能 支持动态换肤,并提供...

    log4j根据日期和文件大小切分日志

    由公司的项目需要根据日期和文件大小切分log4j日志,所以实现来该appender。本人测试通过,并且在公司的其它项目中已有线上使用,暂时还没发现问题。本人代码有写得不好或者错误的地方,欢迎大家指正,谢谢!!!

    java课程设计-计算器-功能完整的科学计算器-仿windows计算器

    java课程设计,里面包含源程序和课程设计报告 题目要求:编写一计算器,仿照windows xp计算器界面,能实现基本的运算及一些科学运算。 能实现的运算如下: "+",加 "-",减 "*",乘 "/",除 "x^y",x的y次方 "Mod",取模 ...

    用Java做的简单计算器源代码

    能实现普通的三角函数(sin、cos等)的运算,log函数、n!等运算。 1.3 实现数制转换的功能 能实现二进制与十进制的相互转换。 1.4要解决的问题 首先,要满足系统的简单需求,实现应有的功能;第二,在对鼠标事件...

    腾讯笔试题java-Log4a:Log4aisanmmapbased,high-performance,highlyavailableAndr

    java 日志4a (英文 | ) Log4a is an mmap based, high-performance, highly available Android log collection framework 为什么 Log4a: 如果喜欢,欢迎star/fork 或者关注我。 Log4a 使用文件映射内存(mmap)作为...

    java计算器课程设计

    1.掌握JAVA语言编程的基础知识并能熟练运用。 2.学习使用Eclipse编写调试程序。 3.熟悉类的声明与对象的使用。 4.理解委托事件处理模型。 5.熟悉使用接口。 6.了解JAVA语言的图形用户界面...9.弧度与角度的切换

    java swing 调用webcam 人脸识别 展示

    java swing 调用webcam 显示全屏视频图像,支持接收Socket指令拍照无卡顿、无设备占用冲突、支持配置端口配置图片保存地址、支持切换窗口模式、视频图像始终前置模式,避免弹窗影响、支持图片旋转角度调整、支持开机...

    xmljava系统源码-superman:java脚手架工程,目前该脚手架工程已整合了swagger2、mybatisplus、log4j2,

    java系统源码 superman superman是什么 superman是自定义的archetype,通过使用superman archetype可以生成满足我们项目需求的工程模板,提高开发效率的同时可以统一团队内的项目结构风格 开发环境 maven3.6.1 jdk...

    关于redis四种不同模式(单例\主从\哨兵\集群)java示例代码项目下载(含完整依赖包).txt

    该项目提供正对redis四种不同模式 (单例...项目主要依赖包commons-pool.jar、jedis-2.6.0.jar、jedis-3.0.1.jar、slf4j-log4j*.jar等(集群模式基于redis5.0版本测试的,运行代码示例时需切换引入jedis-3.0.1.jar)

    java项目之hrm人事管理项目(java毕业设计)

    项目中使用的技术: ... My97时间控件(添加员工) 2、后台:Struts2、动态...其他实战项目:java项目实战之电商系统全套(前台和后台)(java毕业设计ssm框架项目)https://edu.csdn.net/course/detail/25771 java项目之o

    Java博客系统源码(Docker+SpringBoot+Mybatis+thymeleaf).zip

    5. 数据源切换 6. 结合docker,改写install过程,实现docker整合的优化 7. 为个人站上线做准备(修改bug,页面调整,功能调整) 8. 彻底删除install步骤 9. 整合docker-compose实现项目的一键初始化,减少部署流程 10....

    智能文章标题截取功能 专辑增加投稿开放模式 Lerx开源网站内容管理系统(CMS.ext) v6.6.5 JAVA源码

    后端:SpringMVC + Hibernate ORM + MySQL + Hibernate Search(Apache Lucence) + IK中文分词 + Log4J + … 前端:Jquery + Layui + wangEditor/KindEditor + JSON + Ajax 简介: 1.跨平台设计,能无差别运行于...

    java项目之oa办公管理系统(java毕业设计)

     2、后台:SpringMvc、Spring、Hibernate(持久层框架)、JPA、MD5加密、Spring Boot、 log4J日志框架、jstl、jstl自定义分页标签等 3、项目管理工具:Maven 4、数据库:Mysql 5、服务器:Tomcat 项目开发涉及功能: ...

    深蓝音乐铃声播放系统 v8.0.rar

    深蓝音乐铃声系统是目前铃声软件中唯一支持手机远程控制的铃声系统,可以支持PPC手机,谷歌的安卓(Android)手机,以及普通JAVA手机。使用非常小的网络流量,就可以完美的使用手机来遥控铃声系统。  深蓝音乐铃声...

    leetcode下载-java:Studychen编码生涯中的几个java项目

    leetcode下载 说明 此仓库保存笔者的一些 java 项目。 本项目地址 个人博客,欢迎交流 ...简单的自动化测试:检查配置、切换模式、执行异步任务、验证是否成功 Practices 学习Java过程中的一些测试、验证、

    采用jdk实现的日志框架

    日志框架. 实现了动态的切换和log4j类似功能. 采用jdk1.4 log为底层实现. 下载后可以自己定制相关功能. 可以进一步完善.有兴趣可以加QQ:934547801一起讨论

    java8看不到源码-oreka:开源G711、G722、G729、Opus和其他格式的VoIPSIP记录器

    (Log4j2) 升级到java8 指标通过 用于自动代码生成和度量的 Lombork & Aspectj 代码编织 兽网: 切换到 Maven 在所有平台/操作系统上调用播放/下载 建造 码头工人 export DOCKER_BUILDKIT=1 distribution/docker ...

    Android集成主流优秀第三方组件框架

    LOG相关工具类(ToolLog.java) 功能待续-->切入记录异常日志,并存储文件或上传至服务 器 已封装/收集自定义控件: 兼容低版本的SwitchButton 追加自定义属性Value的CheckBox/RadioButton/RadioGroup/...

    Logger.java

    Android统一管理日志类,分开发阶段与上线阶段切换

Global site tag (gtag.js) - Google Analytics