一篇文章带你搞定 Java 日志框架 slf4j
文章目录
- 一、门面模式
- 二、为什么要使用 slf4j ?
- 三、如何使用
一、门面模式
slf4j是门面模式的典型应用,因此在讲slf4j前,先简单学习下门面模式,
门面模式,其核心为外部与一个子系统的通信必须通过一个统一的外观对象进行,使得子系统更易于使用
用一张图来表示门面模式的结构为:
门面模式的核心为Facade即门面对象,门面对象核心为几个点:
- 知道所有子角色的功能和责任
- 将客户端发来的请求委派到子系统中,没有实际业务逻辑
- 不参与子系统内业务逻辑的实现
二、为什么要使用 slf4j ?
我们自己的系统中使用了
logback
这个日志系统
我们的系统使用了 A.jar,A.jar 中使用的日志系统为log4j
我们的系统又使用了 B.jar,B.jar 中使用的日志系统为slf4j-simple
这样,我们的系统就不得不同时支持并维护 logback、log4j、slf4j-simple 三种日志框架,非常不便。
解决这个问题的方式就是引入一个适配层,由适配层决定使用哪一种日志系统,而调用端只需要做的事情就是打印日志而不需要关心如何打印日志,slf4j 或者 commons-logging 就是这种适配层,slf4j 是本文研究的对象
从上面的描述,我们必须清楚地知道一点:slf4j只是一个日志标准,并不是日志系统的具体实现
理解这句话非常重要,slf4j只做两件事情:
- 提供日志接口
- 提供获取具体日志对象的方法
slf4j-simple
、logback
都是 slf4j 的具体实现,log4j 并不直接实现 slf4j,但是有专门的一层桥接 slf4j-log4j12 来实现slf4j。
三、如何使用
slf4j 的直接/间接实现有 slf4j-simple、logback、slf4j-log4j12,我们先定义一个 pom.xml,引入相关jar包:
(1)slf4j-api.jar + slf4j-simple.jar
(2)slf4j-api.jar + slf4j-jdk.jar
(3)slf4j-api.jar + slf4j-log4j12.jar + log4j.jar
(4)slf4j-api.jar + logback
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>testSlf4j</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>14</maven.compiler.source><maven.compiler.target>14</maven.compiler.target></properties><dependencies><!--提供日志接口--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.5.6</version></dependency><!-- 1>>>具体实现--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-jdk14</artifactId><version>1.5.6</version></dependency><!-- 2>>>具体实现--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.21</version></dependency><!-- 3>>>具体实现--><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version></dependency><!-- 4>>>具体实现--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId><version>1.7.2</version></dependency></dependencies>
</project>
简单测试:
public class TestLogger {public static void main(String[] args) {Logger logger = LoggerFactory.getLogger(TestLogger.class);logger.error("123");}
}
接着我们首先把上面 pom.xml 的具体的四种实现注释掉,即不引入任何slf4j
的实现类,运行TestLogger 方法,我们看一下控制台的输出为:
看到没有任何日志的输出,这验证了我们的观点:slf4j不提供日志的具体实现,只有slf4j是无法打印日志的
接着打开 slf4j-simple
的注释,运行 TestLogger 方法,我们看一下控制台的输出为:
看到我们只要引入了一个slf4j的具体实现类,即可使用该日志框架输出日志。
最后做一个测验,我们把所有日志打开,运行 TestLogger 方法,控制台输出为:
和上面的差别是,可以输出日志,但是会输出一些告警日志,提示我们同时引入了多个slf4j的实现,然后选择其中的一个作为我们使用的日志系统。
slf4j 的作用:只要所有代码都使用门面对象 slf4j,我们就不需要关心其具体实现,最终所有地方使用一种具体实现即可,更换、维护都非常方便
同时,SLF4J的日志接口传入的是一个带占位符的字符串,用后面的变量自动替换占位符
public class TestLogger {public static void main(String[] args) {Logger logger = LoggerFactory.getLogger(TestLogger.class);Person person = new Person();person.setName("test");person.setAge(18);logger.info("Set age {} for Person {} ok", person.getAge(), person.getName());logger.error("123");}
}
一篇文章带你搞定 Java 日志框架 slf4j相关推荐
- 一篇文章带你搞定 Java 中 @Target、@Documented 和 @Inherited 注释
文章目录 一.@Target 二.@Documented 注释 三.@Inherited 注释 一.@Target 如果一个Annotation 没有明确地指明定义的位置,则可以在任意的位置使用,例如 ...
- java 不重启部署_一篇文章带你搞定SpringBoot不重启项目实现修改静态资源
一.通过配置文件控制静态资源的热部署 在配置文件 application.properties 中添加: #表示从这个默认不触发重启的目录中除去static目录 spring.devtools.res ...
- 一篇文章带你搞定 MongoDB 实现 REST
文章目录 一.前期准备 二.SpringBoot 实现 MongoDB 的 REST 三.使用 Postman 测试使用 一.前期准备 首先使用 docker 搭建好 MongoDB:一篇文章带你搞定 ...
- 一篇文章带你搞定19年数学建模机场出租车优化问题示例讲解含代码
文章目录 一.问题分析 二.数据介绍 三.模型的求解 四.结果分析 一.问题分析 收集国内某一机场及其所在城市出租车的相关数据,给出该机场出租车司机的选择方案,并分析模型的合理性和对相关因素的依赖性. ...
- 如何使用RSA 对数据加解密和签名验签?一篇文章带你搞定
点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 三分割据纡筹策,万古云霄一羽毛. ...
- 一篇文章带你搞定二维插值的 MATLAB 计算
前面已经学习了二维插值的基本概念:一篇文章带你认识数学建模中的二维插值 本篇文章主要实现使用MATLAB进行二维插值计算 文章目录 一.网格节点的插值计算 二.散点数据的插值计算 1. 示例 1 2. ...
- 一篇文章带你搞定 SpringBoot 自定义欢迎页和网页图标 favicon
文章目录 一.SpringBoot 自定义项目启动欢迎页 二.SpringBoot 自定义 favicon 一.SpringBoot 自定义项目启动欢迎页 已经分析过SpringBoot 的资源访问路 ...
- 一篇文章带你搞定和Spring Boot有关的那些高频面试题
自Spring Boot诞生以来,就引起了业界轰动,目前越来越多的公司技术选型选择拥抱Spring Boot.所以Spring Boot也成为面试必问的问题之一.下面的问题是小胖哥面试了很多候选人后总 ...
- 一篇文章带你搞定线程池的自定义创建和扩展
文章目录 一.自定义线程创建:ThreadFactory 二.扩展线程池 一.自定义线程创建:ThreadFactory 看了那么多有关线程池的介绍,不知道大家有没有思考过一个基本的问题:线程池中的线 ...
最新文章
- ASIC与FPGA能达到的频率差异巨大是为什么
- 03-Tomcat服务器
- python笔记:数组的一些操作
- How to check accessibility errors via Web IDE
- redminote8自动关机怎么回事_红米Note8Pro手机值得入手吗 红米Note8Pro手机全面评测...
- Teams的Incoming Webhook
- python怎么整体缩进_写python代码时怎么快速的给大量代码加上缩进?
- 蓝桥杯 逆波兰表达式——2013年省赛C/C++A组真题6
- 小波同态滤波 matlab,matlab同态滤波程序
- 2020电赛F题–简易无接触温度测量与身份识别装置
- 钢琴学习:B站:时一:《万能左手伴奏》
- 《掌控》及其自我掌控
- KubeEdge 王泽锋:只有代码没有生命力,凝聚开发者的社区才能活力无限 I OpenTEKr 大话开源 Vol.8
- openwrt重启后,修复dns
- 英语不好可以学JAVA吗?来听大咖的建议
- Idea内存占用过高解决方法
- UART串口流控制(Flow control)
- SEAY代码审计系统源码
- 北京某金融公司(Java开发实习生)面试及答案
- [HDU1290]献给杭电五十周年校庆的礼物
热门文章
- 计算机英语和电子线路
- php 泛目录生成程序,泛目录寄生虫程序批量生成源码静态页面版
- bfsk的fpga实现
- 把这首《我快意离职》的诗交给领导后,我就离职了,没意思,在这整天混日子
- vscode自动补全插件c语言,一些提高开发效率的VSCode必备插件(分享),vscode代码补全插件...
- 计算机网络知识点01——物理媒体(双绞铜线、同轴电缆、光纤、无线电信道)的比较
- curl linux 批量下载文件夹,bash – 使用cURL下载目录中的所有文件
- bmp图片中biXPelsPermeter biYPelsPermeter值的含义
- 我骑方轮车笑对坑洼人生
- 鼠标事件(mouseover和mouseenter的区别)