Java Log 学习笔记

参考文章:
1.Java 日志从入门到实战
2.Java日志框架的发展历史,你不想了解一下吗

背景

想自定义 logback 配置文件进行日志分级别记录到不同文件,遇到了几个问题(使用的是 spring-boot 构建的项目,spring-boot 版本为 2.7.12):
1.出现如下报错(图1),得知是 logback 版本应该和配置写的 logback-spring.xml 的语法有出入,spring-boot 2.7.12 是通过使用 spring-booot-starter-logging 依赖引入的相关 logback 依赖,想到参考的 logback 官方文档可能和 logback 依赖包版本不一致,所以更新了 logback 依赖包(图2);
图1-logback 版本不匹配
图2-logback 依赖更新到最新版本
2.更新了 logback 版本之后,发现还是报错(图3),好像是缺少实现类的依赖包;图3-logback 缺少实现
发现 Java Log 有点乱,涉及到的东西很多,于是就想系统的学习一下 Java Log。

Java 日志演化历史

1.System.out 与 System.err 记录日志;
2.Log4j:最先出现的是 Apache 的 Log4j(1996年初),是应用最广泛的日志工具,成为了 Java 日志的标准;作者 - Ceki Gülcü;
3.JUL(Java Util Log):Sun 公司在 2002 年 2 月 Jdk1.4 中,增加了 JUL(在 java.util.logging 包下),企图对抗 Log4j,造成 Java 目前记录日志局面的混乱 - 罪魁祸首;

为什么 JUL 的出现会导致开发局面混乱呢?
想象下你的项目应用使用 Log4j,然后使用了一个第三方库,而第三方库使用了 JUL,那么,你的应用就得同时使用 Log4j 和JUL两个日志工具了,然后又有需要使用另外一个第三方库,但是这个第三方库使用了 Log4j 和 JUL 之外的 simplelog。这个时候你的应用里各种 log 工具满天飞,这势必会使你的程序员感到崩溃。因为这些日志工具互相没有关联,替换和统一日志工具也就变成了比较棘手的一件事情。
如何解决这个问题?
使用”适配器“设计模式,把这个问题进行抽象,抽象出一个接口层,对每个日志实现都进行适配,这样这些提供给别人的库都直接使用抽象层即可。

4.JCL(Jakarta Commons Logging):为了搞定这个日常开发比较棘手的问题,Apache 开源社区在 2002 年 8 月推出了日志接口,叫 commons-logging,也被称为 JCL(Java common logging);JCL 对各种日志接口进行抽象,兼容了主流的 Log4j、JUL、simplelog 等日志实现;提供了 JCL 的默认实现 Simple Log;- spring 依赖了 JCL;
5.log4j 的作者 Ceki Gülcü 觉得 JCL 不够优雅,所以开发了更优雅的日志框架 SLF4J (抽象层,简单日志门面(Simple Logging Facade for Java));- 此时 Ceki Gülcü 已离开了 Apache;

但是 slf4j 只是日志接口,之前已经出现的日志产品,如 JUL 和 Log4j 都是没有实现这个接口的,所以 Ceki Gülcü 使用桥接设计方式开发了桥接包,对接 slf4j 和之前的日志实现。

6.logback 的诞生:Ceki Gülcü 觉得目前市场上的日志标准都是间接实现 slf4j 接口的,都需要桥接包,因此开发了 slf4j 的直接实现 logback,性能超越 log4j;
7. 2012 年,Apache 推出新项目 log4j2(完全不兼容 log4j),其也进行了接口和实现的分离设计,分成 log4j-api(日志接口) 和 log4j-core(日志实现);

Java 日志依赖包

1.接口:
JCL
slf4j
log4j-api

2.实现:
JCL 实现:JUL、log4j
slf4j 接口实现:logback
log4j-api 接口实现:log4j-core

3.桥接包:
JCL(接口)-----> jcl-over-slf4j(桥接包)-----> slf4j(接口)
JUL(产品)<----- slf4j-jdk14(桥接包)<----- slf4j(接口)
JUL(产品)-----> jul-to-slf4j(桥接包)-----> slf4j(接口)
log4j(产品)-----> log4j-over-slf4j(桥接包)-----> slf4j(接口)
log4j(产品)<----- slf4j-log4j12(桥接包)<----- slf4j(接口)
JCL(接口)<----- slf4j-jcl(桥接包)<----- slf4j(接口)
log4j-core(产品)<----- log4j-slf4j-impl(桥接包)<----- slf4j(接口)
log4j-api(接口)-----> log4j-to-slf4j(桥接包)-----> slf4j(接口)
JUL(产品)-----> log4j-jul(桥接包)-----> log4j-api(接口)
log4j(产品)-----> log4j-1.2-api(桥接包)-----> log4j-core(产品)
JCL(接口)-----> log4j-jcl(桥接包)-----> log4j-core(产品)

4.推荐记录日志的组合
logback 官方建议配合 slf4j 使用;
logback 主要由三个模块组成:

  1. logback-core:提供 Logback 的核心功能,是另外两个组件的基础;
  2. logback-classic:地位和作用等同于 log4j ,也被认为是 log4j 的改进版,它实现了 slf4j;
  3. logback-access:主要作为一个与 Servlet 容器交互的模块,比如说 tomcat 或者 jetty,提供一些与 HTTP 访问相关的功能;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/310041.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Activemq存储KahaDb详解

引言 ActiveMQ在不提供持久化的情况下&#xff0c;数据保存在内存中&#xff0c;一旦应用崩溃或者重启之后&#xff0c;数据都将会丢失&#xff0c;这显然在大部分情况下是我们所不希望的。对此ActiveMQ提供了两种持久化方式以供选择。 kahaDB kahaDB是一个基于文件&#xf…

组合总和[中等]

一、题目 给你一个 无重复元素 的整数数组candidates和一个目标整数target&#xff0c;找出candidates中可以使数字和为目标数target的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates中的 同一个 数字可以 无限制重复被选取 。如果…

借助 Google Play 游戏电脑版新功能,加速业务增长

作者 / Google Play 游戏总监 Arjun Dayal Google Play 游戏电脑版测试版自去年发布以来&#xff0c;取得了巨大的发展。Google Play 游戏电脑版现在提供 3,000 多种游戏&#xff0c;覆盖 120 多个国家/地区的用户&#xff0c;为玩家提供各种类型的游戏。我们的热门移动游戏目录…

Grafana监控数据可视化

Grafana 是一个可视化面板&#xff0c;有着非常漂亮的图表和布局展示&#xff0c;功能齐全的度量仪表盘和图形编辑器&#xff0c;支持 Graphite、zabbix、InfluxDB、Prometheus、OpenTSDB、Elasticsearch 等作为数据源&#xff0c;比 Prometheus 自带的图表展示功能强大太多&am…

Jupyter Notebook又一地理数据可视化扩展!

本次分享一个Jupyter Notebook地理数据可视化扩展&#xff1a;pyl7vp pyl7vpPythonl7vp&#xff0c;如其名&#xff0c;是l7vp在Python3方向的封装&#xff0c;l7vp是蚂蚁集团AntV数据可视化团队开发的地理空间智能应用研发开源平台。 通过pyl7vp可在Jupyter Notebook中轻松完…

SVN下载安装(服务器与客户端)

1.下载 服务器下载&#xff1a;Download | VisualSVN Server 客户端下载&#xff1a;自行查找 2. 服务器安装 双击执行 运行 下一步 同意下一步 下一步 选中安装目录 3. 客户端安装 双击执行 下一步 4. 服务器创建仓库 5. 服务器创建用户 6. 客户端获取资源 文件夹右键

【vim 学习系列文章 3.1 -- vim 删除 ^M】

请阅读【嵌入式开发学习必备专栏 之 VIM 专栏】 文章目录 ^M 来源^M 删除 ^M 来源 在 Vim 中打开文件时&#xff0c;您可能会遇到行尾的 ^M 字符&#xff0c;这通常是因为文件使用了 Windows 风格的回车换行符&#xff08;CRLF&#xff09;&#xff0c;而不是 Unix/Linux 风格…

数据结构与算法 - 查找

文章目录 第1关&#xff1a;实现折半查找第2关&#xff1a;实现散列查找 第1关&#xff1a;实现折半查找 代码如下&#xff1a; /*************************************************************date: April 2009copyright: Zhu EnDO NOT distribute this code. ***********…

python+django超市进销存仓库管理系统s5264

本次设计任务是要设计一个超市进销存系统&#xff0c;通过这个系统能够满足超市进销存系统的管理及员工的超市进销存管理功能。系统的主要功能包括&#xff1a;首页、个人中心、员工管理、客户管理、供应商管理、承运商管理、仓库信息管理、商品类别管理、由管理员和员工&#…

【MATLAB】BiGRU神经网络时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 BiGRU神经网络时序预测算法是一种基于双向门控循环单元&#xff08;GRU&#xff09;的多变量时间序列预测方法。该方法结合了双向模型和门控机制&#xff0c;旨在有效地捕捉时间序列数据中…

基于FPGA的数字电路(PWM脉宽调制)

一.PWM的制作原理 假如我们有一个锯齿波&#xff0c;然后在锯齿波上设置一个阈值&#xff08;黑色水平虚线&#xff09;&#xff0c;凡是大于该阈值时输出均为高电平&#xff0c;反之则为低电平&#xff0c;这样我们是不是就得到一个PWM信号呢&#xff1f;如果我们想调整它的占…

【PyQt】(自定义类)QIcon派生,更易用的纯色Icon

嫌Qt自带的icon太丑&#xff0c;自己写了一个&#xff0c;主要用于纯色图标的自由改色。 当然&#xff0c;图标素材得网上找。 Qt原生图标与现代图标对比&#xff1a; 没有对比就没有伤害 Qt图标 网络素材图标 自定义类XJQ_Icon&#xff1a; from PyQt5.QtGui import QIc…