Java日志体系

简介: Java日志体系

Java日志体系

概要

本文的目的是搞清楚Java中各种日志Log之间是怎么的关系,如何作用、依赖,好让我们平时在工作中如果遇到“日志打不出”或者“日志jar包冲突”等之类的问题知道该如何入手解决,以及在各种场景下如何调整项目中的各个框架的日志输出,使得输出统一。

Log日志体系

在日常工作中我们可能看到项目中依赖的跟日志相关的jar包有很多,commons-logging.jarlog4j.jarsl4j-api.jarlogback.jar等等,眼花缭乱。我们要正确的配置,使得jar包相互作用生效之前,就先要理清它们之间的关系。

背景/发展史

那就要从Java Log的发展历程开始说起。

  1. log4j(作者Ceki Gülcü)出来时就等到了广泛的应用(注意这里是直接使用),是Java日志事实上的标准,并成为了Apache的项目
  2. Apache要求把log4j并入到JDK,SUN拒绝,并在jdk1.4版本后增加了JULjava.util.logging
  3. 毕竟是JDK自带的,JUL也有很多人用。同时还有其他日志组件,如SimpleLog等。这时如果有人想换成其他日志组件,如log4j换成JUL,因为api完全不同,就需要改动代码。
  4. Apache见此,开发了JCL(Jakarta Commons Logging),即commons-logging-xx.jar。它只提供一套通用的日志接口api,并不提供日志的实现。很好的设计原则嘛,依赖抽象而非实现。这样应用程序可以在运行时选择自己想要的日志实现组件。
  5. 这样看上去也挺美好的,但是log4j的作者觉得JCL不好用,自己开发出slf4j,它跟JCL类似,本身不替供日志具体实现,只对外提供接口或门面。目的就是为了替代JCL。同时,还开发出logback,一个比log4j拥有更高性能的组件,目的是为了替代log4j。
  6. Apache参考了logback,并做了一系列优化,推出了log4j2

关系/依赖

大概了解心路历程后,再详细看看它们之间的关系、依赖。

JCL

commons-logging已经停止更新,最后的状态如下所示:

JCL支持日志组件不多,不过也有很人用的,例如Spring

 

现在用的也越来越少了,也不多讲了

SLF4J

因为当时Java的日志组件比较混乱繁杂,Ceki Gülcü推出slf4j后,也相应为行业中各个主流日志组件推出了slf4j的适配

 

图的意思为如果你想用slf4j作为日志门面的话,你如何去配合使用其他日志实现组件,这里说明一下(注意jar包名缺少了版本号,在找版本时也要注意版本之间是否兼容)

  • slf4j + logback
    slf4j-api.jar + logback-classic.jar + logback-core.jar
  • slf4j + log4j
    slf4j-api.jar + slf4j-log4j12.jar + log4j.jar
  • slf4j + jul
    slf4j-api.jar + slf4j-jdk14.jar
  • 也可以只用slf4j无日志实现
    slf4j-api.jar + slf4j-nop.jar

SLF4J的适配

slf4j支持各种适配,无论你现在是用哪种日志组件,你都可以通过slf4j的适配器来使用上slf4j。

只要你切换到了slf4j,那么再通过slf4j用上实现组件,即上面说的。

 

其实总的来说,无论就是以下几种情况

  • 你在用JCL
    使用jcl-over-slf4j.jar适配
  • 你在用log4j
    使用log4j-over-slf4j.jar适配
  • 你在用JUL
    使用jul-to-slf4j.jar适配

 

我在网上盗一张图,给大家一个整体的依赖图(懒得画了)

 

让Spring统一输出

这就是为了对slf4j的适配做一个例子说明。

Spring是用JCL作为日志门面的,那我们的应用是slf4j + logback,怎么让Spring也用到logback作为日志输出呢?这样的好处就是我们可以统一项目内的其他模块、框架的日志输出(日志格式,日志文件,存放路径等,以及其他slf4j支持的功能)

很简单,就是加入jcl-over-slf4j.jar就好了。

我又盗了一个图来说明

 

适配思路

其实很简单

  1. 你首先确认需要统一日志的模块、框架是使用哪个日志组件的,然后再找到sfl4j的适配器。
  2. 记得去掉无用的日志实现组件,只保留你要用的。

常见问题

slf4j的日志加载会在程序启动时把日志打出来,所以一定要注意,它会说明加载是否成功,加载了那个日志实现。

slf4j已经对错误作了说明:

http://www.slf4j.org/codes.html

下面讲一下可能经常遇到的问题

Failed to load class org.slf4j.impl.StaticLoggerBinder

没找到日志实现,如果你觉得你已经写上了对应的日志实现依赖了,那你要检查一下了,一般来说极有可能是版本不兼容。

Multiple bindings

找到多个日志实现,slf4j会找其中一个作为日志实现。

代码规范

阿里对此的代码规范:

【强制】应用中不可直接使用日志系统(Log4j、Logback)中的 API,而应依赖使用日志框架 SLF4J 中的 API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

private static final Logger logger = LoggerFactory.getLogger(Abc.class);

总结

文章帮大家梳理了Java日志组件的关系,以及如何解决日常中常见日志相关的问题,希望对大家帮助。

PS:如果觉得我的分享不错,欢迎大家随手点赞、在看。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1月前
|
存储 监控 Cloud Native
|
6月前
|
XML 监控 Java
Java日志框架
日志的概念 日志是记录应用程序运行时所产生的事件信息的工具。使用日志的主要目的是: 排错:通过日志可以排查应用程序运行过程中的问题。可以根据日志定位到错误产生的位置,找出错误原因。 分析:日志可以用来分析应用程序的运行情况,比如流量、访问量等,以便于对系统进行优化。 监控:可以通过日志监控应用程序的运行状态,以及捕捉运行时的安全事件或故障。 审计:日志提供了应用程序运行历史的审计线索,可以用于溯源或 forensic 分析。 理解:日志可以让开发者理解应用程序代码的执行流程。 日志实现:主要的日志实现包括:log4j、logback、log4j2、java.util.logging(JUL)
57 0
|
6月前
|
架构师 Java API
架构师必备,带你弄清混乱的JAVA日志体系!
架构师必备,带你弄清混乱的JAVA日志体系!
62 0
|
8月前
|
XML Java 数据库
JUL 日志 - 最简单易用的Java日志框架
JUL是最容易上手的Java日志框架,最适合初学者,本文一篇教会如何使用
161 0
JUL 日志  - 最简单易用的Java日志框架
|
10月前
|
SQL 安全 Java
|
11月前
|
监控 Java 编译器
异常体系与项目实践
程序中的异常可以反映系统的缺陷和待优化的点,并且是无法完全避免的,如何处理异常和降低异常出现的频率,是系统质量的基础保障;随着分布式架构的流行,各种复杂的请求链路给异常处理带来了巨大的麻烦;
115 0
异常体系与项目实践
|
设计模式 安全 Java
Java日志框架的发展历史,你不想了解一下吗
Java日志框架的发展历史,你不想了解一下吗
127 0
Java日志框架的发展历史,你不想了解一下吗
|
Java 数据库连接 开发者
统一日志处理 | 学习笔记
快速学习 统一日志处理
147 0
|
设计模式 监控 IDE
探析Java日志框架
        目前,几乎所有的应用程序中,都会用到日志框架来记录程序的运行信息。日志虽然不影响应用程序的运行结果,但是没有日志的应用程序是不健全,不完整的。良好的日志系统可以帮助我们快速的定位到程序问题,包括近几年火起来的日志分析系统,比如ELK,日志在我们系统中被重视起来,也起到了举足轻重的作用
107 0
|
XML 设计模式 Java
全网最全、最细致的Java日志框架以及门面技术(二)。
对于一个应用程序来说日志记录是必不可少的一部分。线上问题追踪,基于日志的业务逻辑统计分析等都离不日志。java领域存在多种日志框架,目前常用的日志框架包括Log4j 1,Log4j 2,Commons Logging,Slf4j,Logback,Jul。
全网最全、最细致的Java日志框架以及门面技术(二)。