SLF4J 日志门面

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

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

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

导入依赖:


        org.slf4j
        slf4j-api
        1.7.25

        org.slf4j
        slf4j-simple
        1.7.25

        junit
        junit
        4.12

代码示例:

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错误信息

代码示例:

@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

代码示例:

@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)
    ...

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

  • 在没有绑定任何日志实现框架的基础上,日志不能实现任何功能。slf4j-simple 是 SLF4J 官方提供的简单实现,也需要导入依赖,自动绑定到 SLF4J 日志门面上。
  • Logback 和 Simple(包括 nop) 是 SLF4 出现后提供的日志实现框架,所以 API 完全遵循 SLF4J 进行设计。只需要导入对应的日志实现依赖,即可与 SLF4J 无缝衔接。nop 虽然也划分到实现中,但它是指不实现日志记录。
  • Log4j 和 JUL 是 SLF4J 出现前就已经存在的日志实现框架,所以 API 不遵循 SLF4J 进行设计。需要通过适配桥接的技术,完成的与 SLF4J 的衔接。

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

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


    ch.qos.logback
    logback-classic
    1.2.3

代码示例:

@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错误信息

导入依赖: 注释 logback 依赖。


    org.slf4j
    slf4j-nop
    1.7.25

代码示例:

@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-nop 依赖。


    log4j
    log4j
    1.2.17

代码示例:

@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 的衔接。

导入依赖:


    org.slf4j
    slf4j-log4j12
    1.7.25

再次运行: 虽然日志信息没有打印出来,但根据警告信息可看出使用了 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错误信息

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

导入依赖:


    org.slf4j
    slf4j-jdk14
    1.7.25

代码示例:

@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错误信息

Original: https://www.cnblogs.com/bybeiya/p/16439436.html
Author: 北涯
Title: SLF4J 日志门面

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/585891/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • JavaScript 设计模式

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type&quo…

    Linux 2023年6月13日
    0118
  • podman

    podman Podman 是一个无守护程序、开源的 Linux 原生工具,旨在使用开放容器计划 (OCI) 容器和容器映像轻松查找、运行、构建、共享和部署应用程序。Podman …

    Linux 2023年6月7日
    071
  • redis压力测试【转】

    本文转自: https://segmentfault.com/a/1190000015571891 redis自带的redis-benchmark工具 Redis 自带了一个叫re…

    Linux 2023年5月28日
    072
  • mac如何安装FinalShell

    1、Mac一键安装脚本: curl -o finalshell_install.sh www.hostbuf.com/downloads/finalshell_install.sh…

    Linux 2023年5月28日
    0100
  • Liunx-LVM创建与扩容

    LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,它由Heinz Mauelshagen在Linux 2…

    Linux 2023年6月8日
    097
  • CentOS 6.x安装php 5.6和redis扩展的全过程

    安装PHP 5.6 注1:如果想更换到php5.5或5.4版本, 直接把上面的56w换成55w或者54w就可以了; 注2:php-opcache和php-xcache会有效的提高p…

    Linux 2023年5月28日
    091
  • python 练习题:将列表中的大写字母转换成小写

    将列表中的大写字母转换成小写如果list中既包含字符串,又包含整数,由于非字符串类型没有lower()方法,L1 = [‘Hello’, ‘World’, 18, ‘Apple’,…

    Linux 2023年6月8日
    0141
  • 3.21 Linux PATH环境变量及作用(初学者必读)

    在讲解 PATH 环境变量之前,首先介绍一下 which 命令,它用于查找某个命令所在的绝对路径。例如: [root@localhost ~]# which rm /bin/rm …

    Linux 2023年6月7日
    087
  • MAC Book: Operation not permitted

    背景: 最近清理系统上的一些无用的文件后,为了release出可用空间,所以还要把.Trash目录下的文件清理才真正清理完,但是ls 查看该目录时发现一直报”opera…

    Linux 2023年6月7日
    090
  • SSH免密登录

    SSH免密登录实现三步: 客户端生成公钥和私钥 上传公钥到服务端 SSH免密登录 (1) 客户端生成和公钥和私钥 ssh-keygen 一路回车即可,默认会在~/.ssh/目录下创…

    Linux 2023年6月7日
    096
  • [20220811]奇怪的隐式转换问题(12c补充测试).txt

    [20220811]奇怪的隐式转换问题(12c补充测试).txt –//生产系统遇到一个奇怪的隐式转换问题,问题在于没有发生隐式转换,前面已经做了一些分析增加12c下的…

    Linux 2023年6月13日
    081
  • rocksdb列族笔记

    1、简介 列族(Column Families)是rocksdb3.0提出的一个机制,用于对同一个数据库的记录(键值对)进行逻辑划分。默认情况下所有的记录都会存储在一个默认列族里(…

    Linux 2023年6月7日
    0107
  • 【.Net vs Java? 】 看一看二者的类有多像?

    1. 包(Package)、命名空间(NameSpace) 在Java中常用的是包(Package),较少提到NameSpace的概念。Java官方文档中这样说: 为了使类型更易于…

    Linux 2023年6月7日
    089
  • Linux关于防火墙的命令

    Linux关于防火墙的命令 一、red hat/CentOs7关闭防火墙的命令 查看防火墙状态 systemctl status firewalld service iptable…

    Linux 2023年6月11日
    095
  • springboot工程引用本地lib文件夾内的jar包,打包時把依賴jar包打入jar包

    本地工程新建lib文件夾,并放入jar包 springboot工程引用lib文件夹下的jar包 pom中增加 com.aliyun.vcs.dataengine common sy…

    Linux 2023年6月8日
    0103
  • Linux文本处理相关命令

    一、文本处理命令 Linux sort命令用于将文本文件内容加以排序。 sort 可针对文本文件的内容,以行为单位来排序。 语法格式如下: sort [参数]…[文件] 相关参…

    Linux 2023年5月27日
    097
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球