一、日志门面说明

当我们的系统变的更加复杂的时候,我们的日志就容易发生混乱。随着系统开发的进行,可能会更新不同的日志框架,造成当前系统中存在不同的日志依赖,让我们难以统一的管理和控制。就算我们强制要求所有的模块使用相同的日志框架,系统中也难以避免使用其他类似 spring,mybatis 等其他的第三方框架,它们依赖于我们规定不同的日志框架,而且他们自身的日志系统就有着不一致性,依然会出来日志

体系的混乱。

所以我们需要借鉴 JDBC 的思想,为日志系统也提供一套门面,那么我们就可以面向这些接口规范来开发,避免了直接依赖具体的日志框架。这样我们的系统在日志中,就存在了日志的门面和日志的实现。

常见的日志门面 :

JCL、slf4j

常见的日志实现:

JUL、log4j、logback、log4j2

日志门面和日志实现的关系:

日志框架出现的历史顺序:

log4j -->JUL-->JCL--> slf4j --> logback --> log4j2

我们为什么要使用日志门面:

  1. 面向接口开发,不再依赖具体的实现类。减少代码的耦合

  2. 项目通过导入不同的日志实现类,可以灵活的切换日志框架

  3. 统一 API,方便开发者学习和使用

  4. 统一配置便于项目日志的管理

二、JCL 使用

全称为 Jakarta Commons Logging,是 Apache 提供的一个通用日志 API。

它是为 "所有的 Java 日志实现"提供一个统一的接口,它自身也提供一个日志的实现,但是功能非常常弱(SimpleLog)。所以一般不会单独使用它。他允许开发人员使用不同的具体日志实现工具: Log4j, Jdk 自带的日志(JUL)

JCL 有两个基本的抽象类:Log(基本记录器)和 LogFactory(负责创建 Log 实例)。

JCL 入门

1、添加依赖

  1. <dependency>
  2. <groupId>commons-logging</groupId>
  3. <artifactId>commons-logging</artifactId>
  4. <version>1.2</version>
  5. </dependency>

2、入门代码,基于自身的 SimpleLog

  1. package com.mcode.logger;
  2. import org.apache.commons.logging.Log;
  3. import org.apache.commons.logging.LogFactory;
  4. import org.junit.Test;
  5. /**
  6. * Hello world!
  7. */
  8. public class JCLTest {
  9. /**
  10. * 快速入门JCL
  11. * @throws Exception
  12. */
  13. @Test
  14. public void testQuick() throws Exception {
  15. // 获取 log日志记录器对象
  16. Log log = LogFactory.getLog(JCLTest.class);
  17. // 日志记录输出
  18. log.info("hello jcl");
  19. }
  20. }

3、添加 log4j 依赖

  1. <dependency>
  2. <groupId>log4j</groupId>
  3. <artifactId>log4j</artifactId>
  4. <version>1.2.17</version>
  5. </dependency>

4、添加 log4j.properties

  1. # 指定 RootLogger 顶级父元素默认配置信息
  2. # 指定日志级别=trace,使用的 apeender 为=console
  3. log4j.rootLogger = trace,console
  4. # 指定控制台日志输出的 appender
  5. log4j.appender.console = org.apache.log4j.ConsoleAppender
  6. # 指定消息格式 layout
  7. log4j.appender.console.layout = org.apache.log4j.PatternLayout
  8. # 指定消息格式的内容
  9. log4j.appender.console.layout.conversionPattern = [console]%r %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n

5、基于 log4j 的测试结果

JCL 原理

1、通过 LogFactory 动态加载 Log 实现类

  • SimpleLog:JCL 的内置日志实现
  • Log4JLogger:log4j 日志框架
  • Jdk14Logger:JUL(Java Util Logging)
  • Jdk13LumberjackLogger:Jdk 老版本的内置日志实现

2、日志门面支持的日志实现数组

  1. public class LogFactoryImpl extends LogFactory {
  2. .....
  3. private static final String[] classesToDiscover = new String[].
  4. {
  5. "org.apache.commons.logging.impl.Log4JLogger",
  6. "org.apache.commons.logging.impl.Jdk14Logger",
  7. "org.apache.commons.logging.impl.Jdk13LumberjackLogger",
  8. "org.apache.commons.logging.impl.SimpleLog"
  9. };
  10. .....
  11. }

说明:日志工厂其内部有一个加载日志的数组,加载顺序是按照数组顺序来的,这也解释了为什么入门案例中引入了 Log4J,JCL 内部日志框架就从 JUL 切换至 Log4J 了

3、具体实现代码

  1. for(int i = 0; i < classesToDiscover.length && result == null; ++i) {
  2. result = this.createLogFromClass(classesToDiscover[i], logCategory, true);
  3. }

说明:通过日志数组顺序加载日志框架,如果没有找到,则继续加载下一个,否则直接返回

从原理中我们知道,JCL 是通过一个日志数组顺序加载,日志数组中包含:JCL 的内置日志实现 SimpleLog、log4j 、JUL(Java Util Logging)以及 Jdk 老版本的内置日志实现。

✷ 设计缺陷:如果后期又出现了新的日志实现主流框架,如果你想加载的话,就需要修改 JCL 源代码,实现 Log 接口,放入到日志加载数组中,因此 JCl 已经在 2014 年被 apache 淘汰了

三、SLF4J 使用

简单日志门面(Simple Logging Facade For Java) SLF4J 主要是为了给 Java 日志访问提供一套标准、规范的 API 框架,其主要意义在于提供接口,具体的实现可以交由其他日志框架,例如 log4j 和 logback 等。

当然 slf4j 自己也提供了功能较为简单的实现,但是一般很少用到。对于一般的 Java 项目而言,日志框架会选择 slf4j-api 作为门面,配上具体的实现框架(log4j、logback 等),中间使用桥接器完成桥接。

官方网站:

https://www.slf4j.org/

SLF4J 是目前市面上最流行的日志门面。现在的项目中,基本上都是使用 SLF4J 作为我们的日志系统。

SLF4J 日志门面主要提供两大功能:

  • 日志框架的绑定

  • 日志框架的桥接

application 下面的 SLF4J API 表示 slf4j 的日志门面,包含三种情况:

  • 若是只导入 slf4j 日志门面没有导入对应的日志实现框架,那么日志功能将会是默认关闭的,不会进行日志输出的。

  • 蓝色图里 Logback、slf4j-simple、slf4j-nop 出来的比较晚就遵循了 slf4j 的 API 规范,也就是说只要导入对应的实现就默认实现了对应的接口,来实现开发。

  • 对于中间两个日志实现框架 log4j(slf4j-log4j12)、JUL(slf4j-jdk14)由于出现的比 slf4j 早,所以就没有遵循 slf4j 的接口规范,所以无法进行直接绑定,中间需要加一个适配层(Adaptationlayer),通过对应的适配器来适配具体的日志实现框架,其对应的适配器其实就间接的实现了 slf4j-api 的接口规范。

注意:在图中对于 logback 需要引入两个 jar 包,不过在 maven 中有一个传递的思想,当配置 logback-classic 时就会默认传递 core 信息,所以我们只需要引入 logback-classic 的 jar 包即可。

配合自身简单日志实现(slf4j-simple)

若想使用自身的日志实现框架,需要引入第三方jarslf4j-simple(slf4j 自带实现类):

  1. <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
  2. <dependency>
  3. <groupId>org.slf4j</groupId>
  4. <artifactId>slf4j-simple</artifactId>
  5. <version>2.0.7</version>
  6. </dependency>

其中该坐标包含了对应的slf4j-api的依赖,可以不用手动导入slf4j-api

测试

  1. package com.mcode.logger;
  2. import org.junit.Test;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. public class SLF4JTest
  6. {
  7. //获取Logger实例
  8. private static final Logger LOGGER = LoggerFactory.getLogger(SLF4JTest.class);
  9. @Test
  10. public void testQuick(){
  11. //打印日志记录
  12. LOGGER.error("error");
  13. LOGGER.warn("warn");
  14. LOGGER.info("info");
  15. LOGGER.debug("debug");
  16. LOGGER.trace("trace");
  17. //占位符输出
  18. String name = "mcode";
  19. int age = 20;
  20. LOGGER.info("报错,name:{},age:{}",name,age);
  21. //打印堆栈信息
  22. try {
  23. int i = 5/0;
  24. }catch (Exception e){
  25. LOGGER.error("报错",e);
  26. }
  27. }
  28. }

结果

默认日志等级为INFO,能够实现占位符输出,并且可以在日志等级方法中传入异常实例,来打印对应的日志信息。

配置logback日志实现

引入logback-classic的jar包,其中包含有slf4j-api以及logback-core的依赖,所以只需要引入该依赖即可:

配置Log4J日志实现(需适配器)

首先添加日志框架实现依赖

之前介绍,对于Log4jJUL这些比较早出现的日志实现框架需要有对应的适配层,在这里我们引入对应的适配器slf4j-log412的依赖坐标:

配置JUL日志实现(需适配器)

添加slf4j-nop依赖(日志开关)

桥接旧的日志实现框架

Java日志系列:日志门面JCL、SLF4J的更多相关文章

  1. 日志系列1——slf4j日志框架原理

    目录 1.前言 2.日志门面 3.日志库 4.日志适配器 5.日志库的选用 6.logback.xml 配置文件 1.前言 ​ 说到日志工具,日常工作或学习中肯定听过这些名词:log4j.logbac ...

  2. 在云环境上使用SLF4J对Java程序进行日志记录

    我开发了一个Java应用,部署到云环境上之后,用postman测试发现不能按照我期望的工作,但是返回的消息对我没有任何帮助. 因为部署在云端的应用很难像本地Java应用一样调试,所以我打算用SLF4J ...

  3. Java日志体系(四)slf4j

    1.1 简介 与commons-logging相同,slf4j也是一个通用的日志接口,在程序中与其他日志框架结合使用,并对外提供服务. Simple Logging Facade for Java简称 ...

  4. java并发系列 - 第28天:实战篇,微服务日志的伤痛,一并帮你解决掉

    这是java高并发系列第28篇文章. 环境:jdk1.8. 本文内容 日志有什么用? 日志存在的痛点? 构建日志系统 日志有什么用? 系统出现故障的时候,可以通过日志信息快速定位问题,修复bug,恢复 ...

  5. 《手把手教你》系列基础篇(九十五)-java+ selenium自动化测试-框架之设计篇-java实现自定义日志输出(详解教程)

    1.简介 前面宏哥一连几篇介绍如何通过开源jar包Log4j.jar.log4j2.jar和logback实现日志文件输出,Log4j和logback确实很强大,能生成三种日志文件,一种是保存到磁盘的 ...

  6. Java虚拟机系列(四)---查看GC日志

    这一节穿插一点如何在eclipse中配置并查看某个Java应用GC日志的知识点,我也是通过调研知道的,因为书中写的不是很详细,主要是为下一节做准备. 一.eclipse中配置GC 在eclipse中如 ...

  7. Java混乱的日志体系(logback)(转)

    作为一名 Java 程序员,日常开发工作中肯定会接触日志系统,但是众多的框架,包括 Log4j.Log4j2.Logback.Slf4j.Apache Common logging 等等,引用的 ma ...

  8. Java中的日志框架

    日志框架的介绍和使用 常见的日志框架:JUL(Java.util.logging),JCL(jakarta commons logging),SLF4J,jboss-logging,Log4j,Log ...

  9. java的各种日志框架

    本文是作者原创,版权归作者所有.若要转载,请注明出处.文章中若有错误和疏漏之处,还请各位大佬不吝指出,谢谢大家. java日志框架有很多,这篇文章我们来整理一下各大主流的日志框架, 包括log4j  ...

  10. SpringBoot起飞系列-日志使用(四)

    一.SpringBoot中的日志组件 日志是一个系统中不可缺少的组件.在项目中,我们常用的日志组件有JUL.JCL.Jboss-logging.logback.log4j.log4j2.slf4j.. ...

随机推荐

  1. 2021-11-27:给定一个数组arr,长度为N,做出一个结构,可以高效的做如下的查询: 1) int querySum(L,R) : 查询arr[L...R]上的累加和; 2) int query

    2021-11-27:给定一个数组arr,长度为N,做出一个结构,可以高效的做如下的查询: int querySum(L,R) : 查询arr[L-R]上的累加和; int queryAim(L,R) ...

  2. uni-app 运行项目

    运行-运行到浏览器-选择浏览器 运行新项目:真机测试需要打开真机的开发者选项usb安装调试功能

  3. vue模拟el-table演示插槽用法

    vue模拟el-table演示插槽用法 很多人知道插槽分为三种,但是实际到elementui当中为什么这么用,就一脸懵逼,接下来就跟大家聊一聊插槽在elementui中的应用,并且自己写一个类似el- ...

  4. CodeQl lab learn

    step-3 query a function named strlen import cpp from Function f where f.getName() = "strlen&quo ...

  5. 6 种方式读取 Springboot 的配置,老鸟都这么玩(原理+实战)

    大家好,我是小富- 从配置文件中获取属性应该是SpringBoot开发中最为常用的功能之一,但就是这么常用的功能,仍然有很多开发者在这个方面踩坑. 我整理了几种获取配置属性的方式,目的不仅是要让大家学 ...

  6. 微信公众号redirect_uri 参数错误

    前期所有准备工作我就不在这里一一叙述了.在这说一下需要注意的事项: 1.如果域名为www开头,记得把www去掉,否则依旧会报这个错误 2.跳转域名必须是授权域名的子集,如:'授权域名为 www.bai ...

  7. 蔬菜识别系统Python+TensorFlow+Django+卷积神经网络算法

    一.介绍 蔬菜识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法.并通过对数据集进行训练,最后得到一个识别精度较高的模型.并基于Django框架,开 ...

  8. 基于JavaFX的扫雷游戏实现(三)——交互逻辑

      相信阅读过上期文章,动手能力强的朋友们已经自己跑出来界面了.所以这期我要讲的是交互部分,也就是对于鼠标点击事件的响应,包括计时计数对点击事件以及一些状态量的影响.   回忆下第一期介绍的扫雷规则和 ...

  9. CSS_相关问题及解决_持续更新

    css_margin塌陷问题 问题描述 <div class="father"> <div class="child1"></di ...

  10. HTML前端js

    ajax请求方法书写 $.ajax({ type:"POST", url:CONTEXT_PATH+"/appAudit/insertSnDocCountAdmin&qu ...