一、问题概述

如题所说,后端应用(非spring boot项目)通常用到了很多jar包,比如spring系列、mybatis、hibernate、各类连接数据库的客户端的jar包。可能这个jar包用的是logback、那个用的是log4j、那个又是log4j2,

这时候,怎么才能保证各jar包的日志都能输出,且能以统一的格式输出呢?

为什么要强调非spring boot项目,可参考第四节。

二、几种日志框架的简单介绍

来源:https://juejin.im/post/5a7c5d575188254e76179c0f

Java中的日志框架分如下几种:

1.Log4j

Apache Log4j是一个基于Java的日志记录工具。它是由Ceki Gülcü首创的,现在则是Apache软件基金会的一个项目。

2.Log4j 2

Apache Log4j 2是apache开发的一款Log4j的升级产品。

3.Commons Logging

Apache基金会所属的项目,是一套Java日志接口,之前叫Jakarta Commons Logging,后更名为Commons Logging。

4.Slf4j

Slf4j 类似于Commons Logging,是一套简易Java日志门面,本身并无日志的实现。(Simple Logging Facade for Java,缩写Slf4j)。

5.Logback

一套日志组件的实现(slf4j阵营)。

6.Jul (Java Util Logging)

自Java1.4以来的官方日志实现。

上面这几个框架,又分为了两类:一类是接口,包括了slf4j、commons logging;剩下的几个是具体实现,包括了jul、logback、log4j、log4j2。

现在,讲究针对接口编程,而不是针对具体实现,方便移植。而现在最通用的就是slf4j。就我待过的几家公司来说,全都都用的是slf4j作为日志门面,具体的实现一般直接采用默认的logback。

下面就具体讲讲,怎么将其他框架五花八门的日志一统为slf4j。

三、统一的思路

我们先分析下。

假设有个jar采用了JUL,即java自带的日志系统。我们要怎么才能将其适配到slf4j去呢?

在JUL的logger的方法被调用时,因为Logger所在的包位于java.util,默认就被加载了,不太方便以假乱真。

想要覆盖其实现,我能想到的是,通过aop切面,直接将参数传给slf4j的api,不调用原来的日志实现。

再来,假设有个jar采用了log4j,即写日志用的是org.apache.log4j.Logger,该类是来源于log4j的相关jar包,那么,

我可以排除掉log4j相关的jar包,代码里报错了,对吧?那我再建一个相同package名、相同类名的class。在这个假的

class里,我去调用slf4j的api。

那么,这些功能需要我自己去写吗?不需要!slf4j已经给我们提供了从各类日志框架九九归一到slf4j的转换包。

源日志框架 目标日志框架 所需转换用jar包 maven(这里缺了version字段,请参考下一节)  备注
jul   slf4j
  1. jul-to-slf4j
  1. <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jul-to-slf4j</artifactId>
    </dependency>
 需要排除掉原有依赖。
Commons Logging slf4j
  1. jcl-over-slf4j
  1. <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    </dependency>

需要排除掉原有依赖。

log4j slf4j
  1. log4j-over-slf4j
  1. <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>log4j-over-slf4j</artifactId>
    </dependency>
需要排除掉原有依赖。
log4j2 slf4j

  1. log4j-to-slf4j
  1. <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-to-slf4j</artifactId>
    <version>2.8.2</version>
    </dependency>

需要排除掉原有依赖。

注意这里使用的为

  1. log4j-to-slf4j

这里给一张slf4j官方手册里的,也是漏了log4j2的。

四、如何选择以上转换jar包的版本

在spring boot中,其实根本不需要以上的麻烦工作,只需要引用以下组件:

  1. <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
    <version>1.5.9.RELEASE</version>
    </dependency>
    我们看看这个组件里,包含了什么:

  1. 可以看到,log4jjuljcl(即commons-logging)的转换包都有了。
  2.  
  3. 那么,在非spring boot项目中,我们只要去mvnrepository.com查询:spring-boot-starter-logging.
    然后,选择对应的版本,就可以在下图看到该组件依赖的包:

怎么样,应该是个比较简单的办法吧?

五、未完成的统一之路

这一篇里面,我们还只讲了如何将各日志框架统一到slf4j来。

但是slf4j只是个门面,具体的实现呢(比如log4j等)又被我们排除掉了。

那么slf4j没有实现,也是不能完成输出日志的任务的。

所以我们还需要一个实现。这份留到下篇仔细讲。

六、github代码(已实现上述的统一问题,默认实现采用了logback)

代码路径:

https://github.com/cctvckl/logtest

这里演示下效果:

下面是统一后的:

其中jul为什么日志未统一,等有时间了我再看看。这两天时间有点紧,要开发需求。。。

  1.  

面试题:应用中很多jar包,比如spring、mybatis、redis等等,各自用的日志系统各异,怎么用slf4j统一输出?(上)的更多相关文章

  1. Maven聚合、Maven仓库jar包以及Spring+MyBatis+JUnit+Maven整合测试的搭建过程

    一.Maven将父项目创建到父项目的内部 在父项目的pom.xml上 点右键,选择maven-->new-->maven module  project 二.Maven聚合 在某个项目的p ...

  2. SSH中的jar包讲解(1)

    我们在搭建SSH框架的时候,需要引入各自的一些jar包,相信很多初学者跟我一样,搜个资料,照搬过来(当然版本还得对应),至于为什么要引入这些个jar包,引入它们的作用是啥子,一头雾水,今天我就来跟这些 ...

  3. Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图(转载)

    Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图 2017年04月05日 10:53:13 李学凯 阅读数:104997更多 所属专栏: Intellij Idea   ...

  4. 如何在maven中添加jar包

    Maven 中央仓库地址: 1. http://www.sonatype.org/nexus/ 2. http://mvnrepository.com/ (本人推荐仓库) 3. http://repo ...

  5. 解决eclipse中maven web工程打包成war(发布到tomcar)时lib中没有jar包的解决方法

    可能有两个原因:1.maven中某些jar包下载不下来 从其他地方下载jar文件放到相应maven本地库的.m2里2..classpath文件中缺少(下面代码的作用是制定maven的jar发布路径)& ...

  6. Spring中的jar包详解

    下面给大家说说spring众多jar包的特点吧,无论对于初学spring的新手,还是spring高手,这篇文章都会给大家带来知识上的收获,如果你已经十分熟悉本文内容就当做一次温故知新吧.spring. ...

  7. SSH框架应用中常用Jar包用途介绍

    struts2需要的几个jar包:1)xwork-core-2.1.62)struts2-core-2.1.83)ognl-2.7.34)freemarker-2.3.155)commons-io-1 ...

  8. [解决]UserLibrary中的jar包不会自动发布Tomcat的lib目录下(基于MyEclipse2014)

    1.在工程名称上单击[右键] —— 单击[Properties]选项,点击后会弹出属性窗口: 2.选择[Properties]后在左侧树中找到[MyEclipse] —— [Deployment As ...

  9. 从Maven仓库中导出jar包

    从Maven仓库中导出jar包:进入工程pom.xml 所在的目录下,输入以下命令:mvn dependency:copy-dependencies -DoutputDirectory=lib更简单的 ...

随机推荐

  1. 分享10款效果惊艳的HTML5图片特效

    在HTML5的世界里,图片特效都十分绚丽,我们在网站上也分享过很多不错的HTML5图片特效,现在我们精选10款效果惊艳的HTML5图片特效分享给大家. 1.HTML5 3D正方体旋转动画 很酷的3D特 ...

  2. 面向切面编程(AOP)简介

    在软件中,有些行为对于大多数应用都是通用的.日志,安全和事务管理几乎是所有软件都需要的.他们是否可以主动的参与呢,如果让应用程序只关注与自己所针对的业务领域问题,而其他的问题有其他应用对象来处理.是否 ...

  3. EayRadius 于 2013-7-19 进行体验度更新,增加用户体验度

    EasyRadius于2013-7-19进行更新,此次更新并没有更新通讯接口,通讯接口将统一更新,包括对其他路由的支持 下面我将主要更新的地方向大家描述一下 如果你有疑问或者建议,可以致电137799 ...

  4. IntelliJ IDEA 的 .idea 目录加入.gitignore无效的解决方法

    [转载] 无效的原因是:对应的目录或者文件已经被git跟踪,此时再加入.gitignore后就无效了, 解决办法: 先执行 [文件夹]  git rm -r --cached .idea [文件]   ...

  5. UITextView: 响应键盘的 return 事件

    UITextFieldDelegate代理里面响应return键的回调:textFieldShouldReturn:.但是 UITextView的代理UITextViewDelegate 里面并没有这 ...

  6. android 静默安装 卸载 资料汇总

    1. android + eclipse + 后台静默安装(一看就会) 2. 适用于android1.5以下版本apk静默安装 3. error: INSTALL_FAILED_SHARED_USER ...

  7. MyBatis的深入原理分析之1-架构设计以及实例分析

    MyBatis是目前非常流行的ORM框架,它的功能很强大,然而其实现却比较简单.优雅.本文主要讲述MyBatis的架构设计思路,并且讨论MyBatis的几个核心部件,然后结合一个select查询实例, ...

  8. 【RespberryPi】数码管

    http://blog.mangolovecarrot.net/2015/06/03/raspi-study0801/ 应该可以用两块74HC595来驱动显示8位数的数码管.

  9. vue-cli打包之后的项目在nginx的部署

    vue-cli执行 npm run build 进行打包,生成dist文件夹,把该文件夹下的文件直接复制到nginx服务器目录下,就可打开项目,但是只有首页是可以看到的,再刷新一下就404了,原因是v ...

  10. get calllog fail

    coolpad Coolpad 8122   Uri smsUri = CallLog.Calls.CONTENT_URI;     Cursor callLogCursor = cr.query(s ...