日志通关(一)

转载:https://mp.weixin.qq.com/s/eIiu08fVk194E0BgGL5gow

一、 日志体系

日志发展到今天,被抽象成了三层:接口层、实现层、适配层:
在这里插入图片描述

  • 接口层:或者叫日志门面(facade),就是interface,只定义接口,等着别人实现。
  • 实现层:真正干活的、能够把日志内容记录下来的工具。但请注意它不是上边接口实现,因为它不感知也不直接实现接口,仅仅是独立的实现。
  • 适配层:一般称为Adapter,它才是上边接口的implements。因为接口层和适配层并非都出自一家之手,它们之间无法直接匹配。而鲁迅曾经说过:「计算机科学领域的任何问题都可以通过增加一个中间层来解决」(All problems in computer science can be solved by another level of indirection. – David Wheeler[1]),所以就有了适配层。

适配层又可以分为绑定(Binding)和桥接(Bridging)两种能力:

  • 绑定(Binding):将接口层绑定到某个实现层(实现一个接口层,并调用实现层的方法
  • 桥接(Bridging):将接口层桥接到另一个接口层(实现一个接口层,并调用另一个接口层的接口),主要作用是方便用户低成本的在各接口层和适配层之间迁移

二、日志框架与他们之间关系

Log4j

Log4j相比于System.out提供了更强大的能力,甚至很多思想到现在仍被广泛接受:

  • 日志可以输出到控制台、文件、数据库,甚至远程服务器和电子邮件(被称做 Appender);
  • 日志输出格式(被称做 Layout)允许定制,比如错误日志和普通日志使用不同的展现形式;
  • 日志被分为5个级别(被称作Level),从低到高依次是debug, info, warn, error, fatal,输出前会校验配置的允许级别,小于此级别的日志将被忽略。除此之外还有all, off两个特殊级别,表示完全放开和完全关闭日志输出;
  • 可以在工程中随时指定不同的记录器(被称做Logger),可以为之配置独立的记录位置、日志级别;
  • 支持通过properties或者xml文件进行配置;

不过Log4j有比较明显的性能短板,在Logback和Log4j 2推出后逐渐式微,最终Apache在2015年宣布终止开发Log4j并全面迁移至Log4j 2[10](可参考【2.7 Log4j 2 (2012)】)。

JUL

ava官方的日志系统才随Java 1.4发布。这套系统称做Java Logging API,包路径是java.util.logging,简称JUL。它在Log4j面前仍无太多亮点,广大开发者并没有迁移的动力,导致JUL始终未成气候

JCL

对于独立且轻量的项目来说,开发者可以根据喜好使用某个日志方案即可。但更多情况是一套业务系统依赖了大量的三方工具,而众多三方工具会各自使用不同的日志实现,当它们被集成在一起时,必然导致日志记录混乱

为此Apache在2002年推出了一套接口Jakarta Commons Logging[15],简称 JCL。这套接口主动支持了Log4j、JUL、Apache Avalon、Lumberjack等众多日志工具。开发者如果想打印日志,只需调用JCL的接口即可,至于最终使用的日志实现则由最上层的业务系统决定。我们可以看到,这其实就是典型的接口与实现分离设计;

但因为是先有的实现(Log4j、JUL)后有的接口(JCL),所以JCL配套提供了接口与实现的适配层(没有使用它的最新版,原因会在【1.2.7 Log4j2 (2012)】提到)

在这里插入图片描述
简单介绍一下JCL自带的几个适配层/实现层:

  • AvalonLogger/LogKitLogger:用于绑定Apache Avalon的适配层,因为Avalon 不同时期的日志包名不同,适配层也对应有两个

  • Jdk13LumberjackLogger:用于绑定Lumberjack的适配层

  • Jdk14Logger:用于绑定JUL(因为JUL从JDK 1.4开始提供)的适配层

  • Log4JLogger:用于绑定Log4j的适配层

  • NoOpLog:JCL自带的日志实现,但它是空实现,不做任何事情

  • SimpleLog:JCL自带的日志实现 ,让用户哪怕不依赖其他工具也能打印出日志来,只是功能非常简单

现在JCL作为Apache Commons[18]的子项目,叫 Apache Commons Logging,与我们常用的Commons Lang[19]、Commons Collections [20]等是师兄弟。但JCL的简写命名被保留了下来,并没有改为ACL;

Slf4j

Slf4j也是一个接口层,接口设计与JCL非常接近(毕竟有师承关系)。相比JCL有一个重要的区别是日志实现层的绑定方式:JCL是动态绑定,即在运行时执行日志记录时判定合适的日志实现;而Slf4j选择的是静态绑定,应用编译时已经确定日志实现,性能自然更好。这就是常被提到的classloader问题,更详细地讨论可以参考What is the issue with the runtime discovery algorithm of Apache Commons Logging[24]以及Ceki自己写的文章Taxonomy of class loader problems encountered when using Jakarta Commons Logging[25]。

在推出Slf4j的时候,市面上已经有了另一套接口层JCL,为了将选择权交给用户(我猜也为了挖JCL的墙角),Slf4j推出了两个桥接层:

  • jcl-over-slf4j:作用是让已经在使用JCL的用户方便的迁移到Slf4j 上来,你以为调的是JCL接口,背后却又转到了Slf4j接口。我说这是在挖JCL的墙角不过分吧?
  • slf4j-jcl:让在使用Slf4j的用户方便的迁移到JCL上,自己的墙角也挖,主打的就是一个公平公正公开。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Aspice介绍——测试流程

文章目录 ASPICE简介一、V字模型的示意二、测试领域2.1 SWE.6:软件合格性测试过程目的过程成果基本实践(BP) 2.2 SYS.4:系统集成和集成测试过程目的过程成果基本实践(BP) 2.3 SYS.5:系统合格性测试过程目的…

【linux网络(四)】传输层协议详解(上)

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:Linux从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学更多操作系统知识   🔝🔝 Linux网络 1. 前言2. UDP协议…

备忘录怎么插入文件和附件 备忘录插入文件附件方法

在繁忙的工作与生活中,我们时常需要记录各种信息,而备忘录则成为了我们不可或缺的得力助手。然而,当备忘录中需要包含的文件或附件越来越多时,如何高效、便捷地管理这些文件,便成为了一个亟待解决的问题。 想象一下&a…

深入剖析 Laravel 框架:构建高效PHP应用的最佳实践

引言 随着互联网的高速发展,PHP 作为一门广泛使用的服务器端脚本语言,始终备受开发者青睐。而在众多 PHP 框架中,Laravel 凭借其优雅的设计和高效率,成为了构建现代 Web 应用的热门选择。本文将从零开始,探讨如何使用 …

arcgis portal安装教程(含ECP授权文件)

本文介绍Portal 在windows环境下的安装部署过程,为了顺利进行Portal的安装,建议安装环境是windows server 2016。所以在操作之前首先保证有符合条件的安装机器或虚拟机,安装环境的存储空间建议不低于100G。 安装环境及软件 1、环境&#xff…

o.upload.addEventListener is not a function

o.upload.addEventListener is not a function 在本地的开发环境是可以正常上传的,但是到测试环境,上传就报了这么一个错 在网上寻找的方法 一、 在 node_modules/mockjs/dist/mock.js 第8308行 和 node_modules/mockjs/src/xhr/xhr.js 第216行 添加…

用一个ESP32S3-Zero把有线键盘变为无线

三脚猫最近一直琢磨,那些喜欢买剪线键盘,以及自制键盘瞎折腾的人都是怎么搞的。经过不懈努力,终于想明白除了直接的硬件一个个pin针的高低电压判断后转给蓝牙,拿到现成的古董剪线键盘还有一个方式其实是在usb host转发给蓝牙类似这…

通过iDrac8.0安装Windows Server 2022

1:登录iDrac。 2:启动虚拟控制台。 3:点击虚拟机介质。 4:连接虚拟介质。 5:映射CD/DVD 6: 找到本地的安装镜像。映射设备。 7:在下次引导中选择虚拟CD/DVD/ISO引导。 8:可以在电源中选择重置设备启动&…

替换掉的文件怎么恢复?5个方法,找回数据!

“怎么办呀?刚刚在操作电脑的时候一不小心替换了一个文件,现在根本不知道应该怎么操作才能恢复文件,希望大家可以帮帮我!” 在数字化办公和日常生活中,我们时常会面临文件被意外替换的情况。或许是不小心将新版本的文…

据说可以防静电和浪涌的P6KE30CA

公司有些变送器之前在最后一道校准时,经常发生烧毁的情况。所以在电路的防反接的M7二极管前面又增加了一个TVS二极管,型号P6KE30CA。但愿加了这个好使把。今天又研究了一下这个TVS管子,把搜索到的东西记录一下。放这里备忘把,忘记…

Spring5依赖注入(DI)Set方式注入收录

Spring5依赖注入(DI)Set方式注入收录 依赖注入(Dependency Injection,DI)。 依赖 : 指Bean对象的创建依赖于容器,Bean对象的依赖资源。 注入 : 指Bean对象所依赖的资源 , 由容器来设置和装配。 Set方式…

用java代码实现一个函数,反转一个整数

import java.util.Scanner; public class Test_A25 {public static int reverseInte(int num){int reverse0;while(num!0){int digitnum%10;reversereverse*10digit;num/10;}return reverse;}public static void main(String[] args){System.out.print("请输入你要反转的…

【图书推荐】《Hive入门与大数据分析实战》

本书重点 Hive的网站流量分析项目、旅游酒店评价大数据分析项目,两个案例(均包括SQL和Java编程两种解决方法,SQL实现不用编程)可用于课题研究和毕业论文素材。 内容简介 Hive是基于Hadoop的一个数据仓库工具,用来进…

【Android】安Android Studio环境搭建注意点

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…

通过python操作redis(windows)

注意在连接之前要确保 redis 服务已经安装。 更多的安装信息请查看:https://blog.csdn.net/sinat_20471177/article/details/132042779?spm1001.2014.3001.5501 redis 模块 Python 要使用 redis,需要先安装 redis 模块。如果要做数据导入/导出操作的…

VMware虚拟机-Ubuntu设置共享文件夹(超详细)

目录 前言1. 其他教程2. 创建共享文件夹3. VMware 设置4. Ubuntu 设置4.1 创建 hgfs 目录:4.2 挂载共享目录4.3 验证是否挂载成功4.4 设置开机自动挂载创作不易,禁止转载抄袭!!!违者必究!!! 创作不易,禁止转载抄袭!!!违者必究!!! 创作不易,禁止转载抄袭!!!违…

elasticsearch过滤器filter:原理及使用

码到三十五 : 个人主页 目录 一、引言二、Elasticsearch的过滤器概述三、使用DSL进行过滤操作术语过滤范围过滤复合过滤 四、优化策略五、结语 一、引言 Elasticsearch是一个功能强大的开源搜索引擎,广泛应用于各种数据检索和处理场景。在Elasticsearch…

jetson nano音频驱动代码分析

jetson nano音频驱动代码分析 英伟达audio框架(abub) Platform和Codec驱动程序的功能是 tegra210-admaif:代表音频 DMA (ADMA) 和音频集线器 (AHUB) 之间接口的内核驱动程序 tegra210-xxxx:代表AHUB中各种硬件加速器的内核驱动 tegra210-ahub&#xff1…

怎么缩小pdf文件大小

在数字化时代,pdf文件已经成为我们日常生活和工作中不可或缺的一部分。然而,随着pdf文件内容的增多,其大小也会相应增加,这给文件的传输、存储和共享带来了诸多不便。因此,如何有效地压缩pdf文件大小,成为了…

21组Midjourney绘画关键词,专为游戏设计的奇异生物的盛宴

21组AI绘画关键词,无一不在专为游戏设计的领域中发挥着巨大的作用。从2D游戏艺术到Xbox 360图形,从科幻怪物到异世界写实,这些关键词为游戏开发者提供了丰富多彩的创意资源。通过AI绘画工具,游戏画面呈现更加逼真、独特的设计风格…