작은 이야기 "스토리"시리즈가 명확하게 로깅 프레임 워크 무엇인가

하늘에 비행의 개념, 착륙을 달성하기 위해 필요하다

앞으로 빅 브라더 빅 자매 해피 뉴 이어, 엄지 손가락 이하

텍스트는 GitHub의 오픈 소스 창고에 포함 된 Lu_JavaNodes의 코드 클라우드 창고 주소 Lu_JavaNodes , 모든 마음의지도를 덮고 튜토리얼, 사례 코드 및 후속 비디오를 설명하기 위해, 스타에 돌을 환영 포함되어 있습니다.

기사 기술 요구 사항을 읽어 보았다 로그를

아래 그림과 같이, 당황하지 마십시오 또한 볼이 로그는, 음, 당신이를 본 적이있다.

약간의 이야기 명확한 로깅 프레임 워크

로그의 역할

  • 기록 시스템의 동작
  • 건강 기록 시스템
  • 시스템 오류 로그에 따라 원인을 분석 할 때

이야기는 시작된다

IT 회사에서 호랑이 적극적으로 (카메오) 큰 CRUD 프로젝트를 개발하기 위해 샤오 밍 (엘리트 카메오) 사슴 프로젝트 매니저 프로그래머를 지시한다. 위해이 프로젝트를 개발. 프로그래머의 유일한 작업 프로젝트 그룹 하루 루 샤오밍 (996)

V1.0 링크로 스토리

정보 기술 회사 밖으로 더 나은 수행하기 위해 어느 날, 적극적으로 새로운 수요 밖으로 토라에 작은 사슴 호랑이, 호랑이 강하게 코드 실행의 상황을보고 싶어, 비즈니스의 구현 할 때 콘솔 뭔가 대답 예를 들면 다음과 같습니다 필요가 콘솔에 나타날 때 query 메소드를 실행,이 정보는 인쇄 방법이다.

루 샤오 밍이 아 취급이 용이 생각, 디버깅하고 많은 인쇄 문하지만, 더 그것의 지금 아무것도를 썼다 테스트를위한 자신의 편의를했다. 그래서 모든 CRUD 방법에 초과 근무에 작성한 System.out.println()인쇄 문을. 이 작품의 성공적인 완료.

V2.0 링크로 스토리

시간의 조용한 좋은 기간의 년

귀하의 코드 내부가 : 어느 날 사슴 호랑이 적극적 샤오 밍 찾기 위해 System.out.println()너무 많이 나는 시험 시간 표시는 다음 줄에 표시되지 않습니다, 당신이해야합니다. 당신은에 참여.

루 샤오밍은 생각하려고 : 나는 인쇄 문이 주석 때, 라인에 테스트 시간을두고 다음을 열고 싶지 않아?

그러나 종종이 샤오 밍 사슴 물린, 996은 007, 잠못드는 밤이 버전 V2.0 업데이트가되도록, 쉬운 일이 아니다 주석을 전환 생각했다. 그는 프레임 인쇄 로그 기록-1.0.jar에 캡슐화 스위치를 통합 할 수 있습니다. 이 작품의 성공적인 완료.

故事进入 V3.0 环节

一段时间岁月静好

one day,虎大力找到鹿小明:你这个日志框架功能太简单了 ,再搞点新功能,像输出到文件啊,异步啊都搞上。

鹿小明于是冥思苦想,007之后继续007,废寝忘食的更新出了 V3.0 版本,封装成一个新的框架logging-2.0.jar。顺利完成了这个工作。

故事进入 V4.0 环节

一段时间岁月静好

one day,虎大力找到鹿小明:1.0和2.0的api不一样,1.0换成2.0,2.0换成1.0 每次切换都要改代码,你改一下吧,改成可以想用哪个用哪个的。

鹿小明于是冥思苦想,007之后继续007,这个需求有点难,他从JDBC上找到了灵感,JDBC通过统一接口实现了驱动的切换,日志也可以。

于是,他爆肝搞出来一个日志接口层(日志门面),让 1.0 和 2.0的日志框架都实现这个接口,这样想用1.0的时候就导入1.0,想用2.0的时候就导入2.0 。顺利完成了这个任务。

而这个设计的结构也是现在主流日志框架:log4j logback log4j2 等的结构

日志门面(接口) 日志实现
SLF4J,commons-logging Logback,Log4j

通过它们就打印出了我们常见的各种日志信息

日志框架结构分析

日志框架实际上分为三个部分,除了上面提到的日志门面(接口)和日志库(实现),还有日志适配器

日志门面 接口规范

定义接口规范,不负责具体实现,也就是说以后代码中打印日志时调用的日志门面接口的方法。常见的有 SLF4J,commons-logging 都是这样。常见的日志门面有下面几种

日志门面(接口规范层) 简介
JCL(Jakarta Commons Logging) 这个jar就是常见的 commons-logging.jar,也是Spring框架中使用的日志门面。由于上一次更新还是在2014年,所以不建议使用
SLF4j(Simple Logging Facade for Java) 这个jar可以说是最常用的日志jar包了
jboss-logging 使用最少,一些特定的框架在使用

根据简单的分析,在我们的代码中如果要选择一款 日志的接口规范的话,毫无疑问,只有 SLF4j 配得上我们的项目。

日志库 代码实现

日志库是日志功能的具体实现,早期就是为了替代 System.out 语句而出现的。常用的日志库如下:

日志库(日志实现) 简介
log4j 最早诞生,用的也最多
logback 最晚出现,和log4j同一作者,是log4j的升级版
log-jdk jdk 在1.4版本出现的java.util.logging 简称 log-jdk

在实际的开发中,log4j和logback的使用都非常的广泛,但是如果你现在要开发的是一个新项目,那么推荐使用 logback

日志门面适配器 又名 接口实现转换器

这个东西是啥呢?要从历史说起,在日志框架的历史中,并不是先有 日志门面(接口规范),后有日志库。实际的情况是 作者 先写出来 log4j 用了一段时间之后才有了 slf4j 。

Tips:

  1. slf4j log4j logback 是同一个爹(作者)
  2. log4j 可以等价于 鹿小明写的 1.0 那时候还没有接口规范

因为这个先后顺序的问题,就出现了一个很尴尬的情况,代码实现和接口不兼容,因为log4j的代码中没有实现slf4j的接口,所以要使用 slf4j+log4j的话,需要有个中间层(日志门面适配器)来解决接口的兼容问题。

举个例子:你买的超极本上没有网线插口怎么办呢?买个USB的转换器,这个装换器就是我们说的中间层,也就是 日志门面适配器。 slf4j+“转换器”+log4j 才能正常工作。

通过这样的设计模式,slf4j不仅兼容了log4j,还兼容了很多其他的日志框架。通过阅读slf4j官方文档 可以看到这样一张图

在图中标记了 1 2 3 4,对照前面的概念解释一下

标记1:这是只有接口规范,没有日志实现的情况,项目中只有接口没有实现也就不会有任何日志信息输出。

标记2:应用代码中使用logback作为日志库实现,通过图示可以看到logback是直接实现SLF4J接口的,不需要“转换器”。接口层+代码实现。这也是logback和log4j的区别之一。

标记3:应用代码中使用log4j作为日志库实现,这个图示在slf4j-api.jar之后,还有一个slf4j-log4j12.jar,他就是我们提到过的“转换器”日志门面适配器。接口层+转换器+代码实现 的关系。

标记4:这个图示中也有转接头jar包,只不过这个jar包是为了兼容log-jdk。

那么问题来了,logback和log4j在使用上有什么区别?

日志库适配器 又名slf4j如何一统日志江湖?

日志门面适配器“接口实现转接器”解决了接口规范和实现之间不兼容的问题。我们终于可以愉快的开始枯燥的日志打印了。

但是慢着,难道没有觉得哪里不对吗?你品,你细品

虽然我们的项目采用slf4j在快乐的打印日志,但是其他的框架用的可不是slf4j,譬如Spring(commons-logging)、Hibernate(jboss-logging),这种情况下 我们的项目的就像一个国家有了很多套法律,到底听谁的, 所以我们需要让别的框架和log4j一起统一使用slf4j进行输出日志?

咋能做到呢?这就要用到日志库适配器了。它也是一个转接头,举个栗子

slf4j 相当于只有type-c接口的苹果电脑。现在你有很多U盘想接到电脑上,但是U盘用的是USB接口,要怎么办呢?

买一个 type-c 转 USB的转换器即可

通过官方文档找到下面这张图—说明了 其他日志框架如何接入到slf4j上

这张图上有三个图示,由于三个的原理的都一样,我们以左上角的为例做简单的讲解:

这张图我们先竖着看,就是应用程序使用的logback做日志框架,接口规范+实现的简单关系。

接着我们横着看,会看到 commons-logging log4j(之前说过log4j生的早)log-jdk,这些就是应用中其他框架Spring等使用的日志框架,想让这些框架统一接入到slf4j, 怎么办呢?

以commons-logging为例,如果你的项目中用了Spring,Spring就需要使用到commons-logging.jar ,怎么让 Spring 的日志最终通过 slf4j 输出呢?

1.我们需要先排除 commons-logging.jar ,毕竟它压根儿就没有输出到slf4j的功能,但是排除之后spring会报错啊,不要慌 这就到了第二步。

2.用 jck-over-slf4j.jar 替换 commons-logging.jar, 这个包有什么作用呢?偷天换日,鸠占鹊巢,它就是我们要找的转换器,一方面它的功能和commons-logging一样,完全可以替代;另一方面,可以无缝接入到slf4j。

这个中间转换器包就是就是日志库适配器。

简单吧,通过上述两步就可以实现 commons-logging 统一到slf4j 。

通过这样的逻辑,可以很简单的把log4j,log-jdk 也都能通过中间的转换包统一到slf4j,也就实现了slf4j一统日志江湖。

总结

总结回顾好习惯

日志框架分为

1.日志门面,定义了日志的接口规范

2.日志库,实现日志具体功能的代码实现

3.日志门面适配器,又名 接口实现转换器

4.日志库适配器,又名 第三方接入slf4j转接头

注意

在使用 slf4j + 日志库 模式的时候,要防止日志库冲突,简单说就是 要么用 slf4j+log4j 要么用 slf4j+logback 千万不要两个都用!!!

恭喜你完成了本文的阅读,为你鼓掌!

本文讲解的内容是 日志框架的基本认识,关于日志框架在项目中的使用,以及开发中的日志规范,请持续关注。

自测面试题

  • logback 和 log4j的区别

求关注,求点赞,求转发

本人拥有两年开发经验和三年Java大数据教学经验,曾帮助2000+学生成功就业和跳槽。

欢迎关注本人公众号:鹿老师的Java笔记,将在长期更新Java技术图文教程和视频教程,Java学习经验,Java面试经验以及Java实战开发经验。

추천

출처juejin.im/post/5e46084de51d4526e1493dcd