文章

一起学Java(10)-[日志篇]教你为本项目引入SLF4J接口层框架

在上一节一起学Java(9)-为项目引入Log框架(Log篇一-框架演进和设计逻辑中,我们已经理清了Java日志框架的演进过程、设计思想和核心框架。从这节开始,进入实战研究环节。

回顾下Java日志框架的设计结构。

Java日志设计

先研究接口层框架SLF4J

一、引入SLF4J

一起学Java(9)-为项目引入Log框架中,我们已经分析过了,对于Java接口层来说,SLF4J几乎已经是实时的标准和唯一选择。目前官方(官网地址:https://www.slf4j.org/)最新稳定版是2.0.16,发布于2024年8月10日。

通过Gradle引入最新版SLF4J,修改build.gradle.kts文件:

1
2
3
dependencies {
    implementation("org.slf4j:slf4j-api:2.0.16")
}

按照SLF4J官方文档,编写代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.coderli.one.log;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author OneCoder
 * @Blog https://www.coderli.com
 */
public class LogMain {
    public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger(LogMain.class);
        logger.info("Hello World");
    }
}

直接运行代码,提示错误:

1
2
3
SLF4J(W): No SLF4J providers were found.
SLF4J(W): Defaulting to no-operation (NOP) logger implementation
SLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details.

这个信息的意思是,SLF4J 没有找到实际的日志实现库,因此它将默认使用一个“无操作”的日志实现,即不会输出任何日志信息。因为,前面我们已经提到SLF4J只是一个日志接口层框架,想要运行它需要引入一个日志实现层框架来提供具体的日志实现。常见在上篇一起学Java(9)-为项目引入Log框架已经分析过了,不再赘述,这里我们先直接选用同一个作者,无缝衔接Logback作为日志实现层,后续我们在体验Log4j 2的实现方式。当前Logback最新稳定版为1.5.6

二、引入Logback

修改build.gradle.kts中的依赖引入部分

1
2
3
4
    dependencies {
        implementation("org.slf4j:slf4j-api:2.0.16")
        implementation("ch.qos.logback:logback-classic:1.5.6")
    }

重新执行代码,成功得到输出:

1
21:35:48.876 [main] INFO com.coderli.one.log.LogMain -- Hello World

至此,一个最简单SLF4J+Logback的项目日志框架方案就引入完成了。依赖只有两个接口层的slf4j-api和实现层的logback-classic,没有那一大堆乱七八糟的jar。

当然,实际项目中日志使用比这个样例复杂的多,需要根据项目需要进行日志框架的配置,这些是日志实现层框架提供的功能。Logback自然也支持更为复杂的应用配置,具体需要通过logback-test或logback文件配置实现,这个我们后续会慢慢研究。

对我而言,下一步,我更好奇的是,在没引入logback-classic时,程序怎么输出的那段错误信息,以及在引入了logback后,程序怎么自动找到的日志实现,正常输出。下一节,我会研究这部分内容。

项目的整体配置和上述代码以同步提交到Github上:https://github.com/lihongzheshuai/java-all-in-one,可以同步更新。项目的整体结构也进行了调整,后续择机进行这部分的介绍。

最近很忙,更新慢了,见谅。

喝酒,走肾 写码,走心

本文由作者按照 CC BY 4.0 进行授权