01、简单介绍

官方网址:https://www.slf4j.org/

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

SLF4J 自身也提供了功能较为简单的实现,但是一般很少用到。对于一般的 Java 项目而言,日志框架会选择 slf4j-api 作为门面,配上具体的实现框架,中间使用桥接器完成桥接。所以 SLF4J 最重要的两个功能就是对于日志框架的绑定以及日志框架的桥接。

02、日志级别

级别 描述
trace 日志追踪信息
debug 日志详细信息
info(默认) 日志关键信息
warn 日志警告信息
error 日志错误信息

03、入门案例

导入依赖:

<dependencies>
<!-- slf4j核心依赖 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<!-- slf4j自带的简单日志实现 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.25</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>

代码示例:

package com.slf4j;

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class Slf4jTest {
@Test
public void test01(){
// 没有集成其它日志实现框架的话,使用自带的简单日志实现框架(slf4j-simple)
Logger logger = LoggerFactory.getLogger(Slf4jTest.class);
logger.trace("trace追踪信息");
logger.debug("debug详细信息");
logger.info("info关键信息");
logger.warn("warn警告信息");
logger.error("error错误信息");
}
}

运行结果:

[main] INFO com.slf4j.Slf4jTest - info关键信息
[main] WARN com.slf4j.Slf4jTest - warn警告信息
[main] ERROR com.slf4j.Slf4jTest - error错误信息

03、动态打印

代码示例:

@Test
public void test02() {
Logger logger = LoggerFactory.getLogger(Slf4jTest.class);
String name = "张三";
int age = 23;
// 字符串拼接,麻烦、可读性差
//logger.info("学生信息:姓名-" + name + ";年龄-" + age + "");
// 动态信息打印,使用占位符的形式来代替字符串的拼接
logger.info("学生信息:姓名-{};年龄-{}", name, age);
}

运行结果:

[main] INFO com.slf4j.Slf4jTest - 学生信息:姓名-张三;年龄-23

04、异常打印

代码示例:

@Test
public void test03() {
Logger logger = LoggerFactory.getLogger(Slf4jTest.class);
try {
Class.forName("User");
} catch (ClassNotFoundException e) {
logger.info("异常信息:", e);
}
}

运行结果:

[main] INFO com.slf4j.Slf4jTest - 异常信息:
java.lang.ClassNotFoundException: User
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at com.slf4j.Slf4jTest.test03(Slf4jTest.java:34)
...

05、日志集成

SLF4J 日志门面共有三种情况对日志实现进行绑定。

  • 在没有绑定任何日志实现框架的基础上,日志不能实现任何功能。slf4j-simple 是 SLF4J 官方提供的简单实现,也需要导入依赖,自动绑定到 SLF4J 日志门面上。

  • Logback 和 Simple(包括 nop) 是 SLF4 出现后提供的日志实现框架,所以 API 完全遵循 SLF4J 进行设计。只需要导入对应的日志实现依赖,即可与 SLF4J 无缝衔接。nop 虽然也划分到实现中,但它是指不实现日志记录。

  • Log4j 和 JUL 是 SLF4J 出现前就已经存在的日志实现框架,所以 API 不遵循 SLF4J 进行设计。需要通过适配桥接的技术,完成的与 SLF4J 的衔接。

注意: 在 SLF4J 环境下,若同时导入多个日志实现框架,默认使用先导入的。在实际应用中,一般只集成一种日志实现。

06、集成 logback

导入依赖: 注释 slf4j-simple 依赖。

<!-- logback日志框架 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>

代码示例:

@Test
public void test01() {
Logger logger = LoggerFactory.getLogger(Slf4jTest.class);
logger.trace("trace追踪信息");
logger.debug("debug详细信息");
logger.info("info关键信息");
logger.warn("warn警告信息");
logger.error("error错误信息");
}

运行结果:

12:26:18.489 [main] DEBUG com.slf4j.Slf4jTest - debug详细信息
12:26:18.492 [main] INFO com.slf4j.Slf4jTest - info关键信息
12:26:18.492 [main] WARN com.slf4j.Slf4jTest - warn警告信息
12:26:18.492 [main] ERROR com.slf4j.Slf4jTest - error错误信息

07、集成 slf4j-nop

导入依赖: 注释 logback 依赖。

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.25</version>
</dependency>

代码示例:

@Test
public void test01() {
Logger logger = LoggerFactory.getLogger(Slf4jTest.class);
logger.trace("trace追踪信息");
logger.debug("debug详细信息");
logger.info("info关键信息");
logger.warn("warn警告信息");
logger.error("error错误信息");
}

运行结果: 可以看到没有日志输出,其主要作用是禁止日志打印。


08、集成 log4j

导入依赖: 注释 slf4j-nop 依赖。

<!-- log4j日志框架 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>

代码示例:

@Test
public void test01() {
Logger logger = LoggerFactory.getLogger(Slf4jTest.class);
logger.trace("trace追踪信息");
logger.debug("debug详细信息");
logger.info("info关键信息");
logger.warn("warn警告信息");
logger.error("error错误信息");
}

运行结果: 报错了。

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

因为 Log4j 是 SLF4J 出现前就已经存在的日志实现框架,所以 API 不遵循 SLF4J 进行设计。需要通过适配桥接的技术来完成的与 SLF4J 的衔接。

导入依赖:

<!-- log4j适配器 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>

再次运行: 虽然日志信息没有打印出来,但根据警告信息可看出使用了 Log4j 日志框架。

log4j:WARN No appenders could be found for logger (com.slf4j.Slf4jTest).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

创建配置: log4j.properties 文件。

#配置日志级别,输出器
log4j.rootLogger=INFO,console
#配置控制台输出器
log4j.appender.console=org.apache.log4j.ConsoleAppender
#配置自定义格式器
log4j.appender.console.layout=org.apache.log4j.PatternLayout
#配置自定义转换模式
log4j.appender.console.layout.conversionPattern=[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5p] [%t] [%-4rms] [%c#%M-%L] %m%n

再次运行:

[2022-07-01 12:44:21.977] [INFO ] [main] [0   ms] [com.slf4j.Slf4jTest#test01-14] info关键信息
[2022-07-01 12:44:21.979] [WARN ] [main] [2 ms] [com.slf4j.Slf4jTest#test01-15] warn警告信息
[2022-07-01 12:44:21.979] [ERROR] [main] [2 ms] [com.slf4j.Slf4jTest#test01-16] error错误信息

09、集成 jul

因为 JUL 日志框架是 JDK 内置的工具包,无需导入依赖。JUL 是 SLF4J 出现前就已经存在的日志实现框架,所以 API 不遵循 SLF4J 进行设计。需要通过适配桥接的技术,完成的与 SLF4J 的衔接。

导入依赖:

<!-- jul适配器 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.7.25</version>
</dependency>

代码示例:

@Test
public void test01() {
Logger logger = LoggerFactory.getLogger(Slf4jTest.class);
logger.trace("trace追踪信息");
logger.debug("debug详细信息");
logger.info("info关键信息");
logger.warn("warn警告信息");
logger.error("error错误信息");
}

运行结果:

七月 01, 2022 12:50:56 下午 com.slf4j.Slf4jTest test01
信息: info关键信息
七月 01, 2022 12:50:56 下午 com.slf4j.Slf4jTest test01
警告: warn警告信息
七月 01, 2022 12:50:56 下午 com.slf4j.Slf4jTest test01
严重: error错误信息

SLF4J 日志门面的更多相关文章

  1. Log4j2日志框架集成Slf4j日志门面

    1.说明 本文介绍使用日志门面Slf4j打印日志, 底层日志实现使用Log4j2框架, 方便以后切换底层日志实现, Log4j2可以替换成Logback等. 2.依赖管理 在pom.xml依赖管理中导 ...

  2. SLF4J日志门面

    SLF4J官网:http://www.slf4j.org/ SLF4J的作用通俗点讲,就是可以让我们的项目以最小的代价更换不同的日志系统.无需修改代码,只需要添加.删除相应的jar包和配置文件. 1. ...

  3. catalina.out日志膨胀问题解决实例,日志门面commons-logging的实践

    声明:迁移自本人CSDN博客https://blog.csdn.net/u013365635 笔者在公司的时候,遇到一个问题,2个模块A.B Tomcat中的catalina.out及catalina ...

  4. SLF4J 简单日志门面 介绍和使用

    参考:http://singleant.iteye.com/blog/934593        http://liuzidong.iteye.com/blog/776072 介绍: 简单日记门面(s ...

  5. springboot结合日志门面SLF4j和日志实现Logback的使用

    一.此处主要介绍在springboot工程下如何使用 logback + slf4j  进行日志记录. logback主要包含三个组成部分:Loggers(日志记录器).Appenders(输出目的在 ...

  6. slf4j日志的使用

    slf4j(simple logging facade for Java)是Java的简单的日志门面,它不是具体的日志解决方案,它只服务于各种各样slf4j-logo的日志系统.这里的slf4j-lo ...

  7. Log4j,Log4j2,logback,slf4j日志学习

    日志学习笔记 Log4j Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.数据库等:我们也可以控制每一条日志的输出格式:通过定义每一条 ...

  8. Log4j,Log4j2,logback,slf4j日志学习(转)

    日志学习笔记Log4jLog4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.数据库等:我们也可以控制每一条日志的输出格式:通过定义每一条日志 ...

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

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

随机推荐

  1. Attention Mechanism in Computer Vision

    ​  前言 本文系统全面地介绍了Attention机制的不同类别,介绍了每个类别的原理.优缺点. 欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结.最新技术跟踪.经典论文解读.CV招聘信息. 概 ...

  2. python基础练习题(题目 有序列表插入元素)

    day26 --------------------------------------------------------------- 实例039:有序列表插入元素 题目 有一个已经排好序的数组. ...

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

    1.简介 上一篇宏哥介绍是如何使用logback将日志输出到控制台中,但是如果需要发给相关人需要你拷贝出来,有时候由于控制台窗口的限制,有部分日志将会无法查看,因此我们还是需要将日志输出到文件中,因此 ...

  4. Android 12(S) 图像显示系统 - 基础知识之 BitTube

    必读: Android 12(S) 图像显示系统 - 开篇 一.基本概念 在Android显示子系统中,我们会看到有使用BitTube来进行跨进程数据传递.BitTube的实现很简洁,就是一对&quo ...

  5. C#常见控件与SQL Sever数据库交互

    C#常见控件与SQL Sever数据库交互 下拉框(ComboBox)与数据库绑定 首先,我们采用DataSet作为临时的数据库,这样会比较好 那么,我们先创建两个成员(对象) string sqlc ...

  6. Java基础语法Day_05(数组的概念)

    第14节 数组         day05_01_数组的概念 day05_02_数组的定义格式一_动态初始化 day05_03_数组的定义格式二_静态初始化 day05_04_数组的定义格式三_省略的 ...

  7. 攻防世界-MISC:glance-50

    这是攻防世界MISC高手进阶区的题目,题目如下: 点击下载附件一,得到一张GIF动图如下 找个网站给分离一下,将gif分离为图片,共201张,然后拼接在一起即可得到flag 所以这道题的flag如下: ...

  8. ImageView的scaleType属性 与 adjustViewBounds属性

    ImageView的scaleType的属性有好几种,分别是matrix(默认).center.centerCrop.centerInside.fitCenter.fitEnd.fitStart.fi ...

  9. 数据结构_C语言_单链表

    # include <stdio.h> # include <stdbool.h> # include <malloc.h> typedef int DataTyp ...

  10. 干货 | 一文彻底读懂nginx中的location指令

    一个执着于技术的公众号 Nginx系列导读 给小白的 Nginx 10分钟入门指南 Nginx编译安装及常用命令 完全卸载nginx的详细步骤 Nginx 配置文件详解 一文带你读懂Nginx反向代理 ...