SpringBoot整合Sfl4j+logback的实践

简介: 对于一个web项目来说,日志框架是必不可少的,日志的记录可以帮助我们在开发以及维护过程中快速的定位错误。`slf4j`,`log4j`,`logback`,`JDK Logging`等这些日志框架都是我们常见的日志框架,本文主要介绍这些常见的日志框架关系和SpringBoot整合Sfl4j+logback的实践。

一、概述

对于一个web项目来说,日志框架是必不可少的,日志的记录可以帮助我们在开发以及维护过程中快速的定位错误。slf4j,log4j,logback,JDK Logging等这些日志框架都是我们常见的日志框架,本文主要介绍这些常见的日志框架关系和SpringBoot整合Sfl4j+logback的实践。

image-20230801224302326

二、日志系统介绍

1.日志系统介绍

首先slf4j可以理解为规则的制定者,是一个抽象层,定义了日志相关的接口。log4j,logback,JDK Logging都是slf4j的实现层,只是出处不同,当然使用起来也就各有千秋。

img

2.为什么使用Sfl4j+logback?

slf4j+logback是这些组合中最常见的日志搭配。总结起来起核心的优势有:(1)使用slf4j+logback的性能更高;(2)slf4jlogback框架的作者是同一个,所以兼容性更好。

三、SpringBoot整合Sfl4j+logback的实践

网上很多教程说明配置Sfl4j+logback时,都会要求引入logback-classic等依赖,这在使用Spring框架的时候确实是必须的,但在使用Springboot框架是没必须的,因为在spring-boot-starter中已经整合了Sfl4j+logback日志系统。

<dependency> 
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-classic</artifactId>
  <version>1.2.3</version>
</dependency>

image-20230801215848513

1.添加logback-spring.xml配置文件

以下是一个logback-spring.xm的常见配置,我们以以下这个模板来说明其中配置项的含义。

<?xml version="1.0" encoding="UTF-8"?>
<!-- 一般根节点不需要写属性了,使用默认的就好 -->
<configuration>

    <contextName>demo</contextName>

    <!-- 该变量代表日志文件存放的目录名 -->
    <property name="log.dir" value="logs"/>
    <!-- 该变量代表日志文件名 -->
    <property name="log.appname" value="eran"/>

    <!--定义一个将日志输出到控制台的appender,名称为STDOUT -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 内容待定 -->
    </appender>

    <!--定义一个将日志输出到文件的appender,名称为FILE_LOG -->
    <appender name="FILE_LOG" class="ch.qos.logback.core.FileAppender">
        <!-- 内容待定 -->
    </appender>

    <!-- 指定com.demo包下的日志打印级别为INFO,但是由于没有引用appender,所以该logger不会打印日志信息,日志信息向上传递 -->
    <logger name="com.demo" level="INFO"/>

    <!-- 指定最基础的日志输出级别为DEBUG,并且绑定了名为STDOUT的appender,表示将日志信息输出到控制台 -->
    <root level="debug">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

1.标签

定义日志策略的节点,一个日志策略对应一个<appender>,一个配置文件中可以有零个或者多该节点,但一个配置文件如果没有定义至少一个<appender>,虽然程序不会报错,但就不会有任何的日志信息输出,也失去了意义。该节点有两个必要的属性:

  • name:指定该节点的名称,方便之后的引用。
  • class:指定该节点的全限定名,所谓的全限定名就是定义该节点为哪种类型的日志策略,比如我们需要将日志输出到控制台,就需要指定class的值为ch.qos.logback.core.ConsoleAppender;需要将日志输出到文件,则class的值为ch.qos.logback.core.FileAppender等。

2.标签

用来设置某个包或者类的日志打印级别,并且可以引用绑定日志策略,在该节点内可以添加子节点<appender-ref>,该节点有一个必填的属性ref,值为我们定义的<appender>节点的name属性的值。该节点有三个属性:

  • name:用来指定受此约束的包或者类。
  • level:可选属性,用来指定日志的输出级别,如果不设置,那么当前会继承上级的级别。
  • additivity:是否向上级传递输出信息,两个可选值true or false,默认为true。

3.标签

  • <logger>一个特殊的<logger>,即默认name属性为root<logger>,因为是根<logger>,所以不存在向上传递一说,故没有additivity属性,所以该节点只有一个level属性。

常见的配置如下:

<pattern>[Eran]%date [%thread %line] %level >> %msg >> %logger{10}%n</pattern>

异步写入日志AsyncAppender。AsyncAppender并不处理日志,只是将日志缓冲到一个BlockingQueue里面去,并在内部创建一个工作线程从队列头部获取日志,之后将获取的日志循环记录到附加的其他appender上去,从而达到不阻塞主线程的效果。因此AsynAppender仅仅充当事件转发器,必须引用另一个appender来写日志。常见的配置如下:

<appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender">  
    <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->  
    <discardingThreshold >0</discardingThreshold>  
    <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->  
    <queueSize>512</queueSize>  
    <!-- 添加附加的appender,最多只能添加一个 -->  
    <appender-ref ref ="FILE_LOG"/>
</appender>

2.代码中添加日志逻辑

添加好logback-spring.xml配置文件后,就可以在代码中添加日志逻辑,添加也很简单,只需要通过log.info()这样的方式来实现。

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
public class TestController01 {
   
   
    @RequestMapping("/hello")
    public String index() {
   
   
        log.debug("hello world0.");
        log.info("hello world.");
        log.warn("hello world1.");
        log.error("hello world2.");
        return "Hello World.";
    }

}

Slf4j有四个级别的log level可供选择,级别从上到下由低到高,优先级高的将被打印出来。

  1. debug:简单来说,对程序调试有利的信息都可以debug输出
  2. info:对用户有用的信息
  3. warn:可能会导致错误的信息
  4. error:顾名思义,发生错误的地方

为了简化创建logger对象的逻辑,可以直接使用lombok的@Slf4j的注解,只需要在pom文件中引入以下依赖:

<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.18.10</version>
  <scope>provided</scope>
</dependency>

具体代码实现和配置文件:https://github.com/yangnk/SpringBoot_Learning/tree/master/SpringbootLogDemo

四、其他

推荐一个IDEA中日志查看插件:Grep Console。这是一个帮你分析控制台日志的插件,可以对不同级别的日志进行不同颜色的高亮显示,具体效果如下:

image-20230801224143035

参考资料

  1. slf4j官网:https://www.slf4j.org/manual.html
  2. 一步一步带你熟悉SpringBoot 配置slf4j+logback:https://blog.csdn.net/weixin_49307478/article/details/126836019
  3. SpringBoot整合logback,slf4j:https://blog.csdn.net/weixin_42259925/article/details/103954982

  1. Spring Boot 热部署与日志:https://note.youdao.com/ynoteshare/index.html?id=a1475b8cffccdffcd309dd2a11832a35&type=notebook&_time=1690880845507#/792785BEB2704916A3F0475BD2E88257
目录
相关文章
|
并行计算 Java 数据处理
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
1059 0
|
10月前
|
JSON 前端开发 Java
深入理解 Spring Boot 中日期时间格式化:@DateTimeFormat 与 @JsonFormat 完整实践
在 Spring Boot 开发中,日期时间格式化是前后端交互的常见痛点。本文详细解析了 **@DateTimeFormat** 和 **@JsonFormat** 两个注解的用法,分别用于将前端传入的字符串解析为 Java 时间对象,以及将时间对象序列化为指定格式返回给前端。通过完整示例代码,展示了从数据接收、业务处理到结果返回的全流程,并总结了解决时区问题和全局配置的最佳实践,助你高效处理日期时间需求。
1448 0
|
10月前
|
存储 Java 数据库
Spring Boot 注册登录系统:问题总结与优化实践
在Spring Boot开发中,注册登录模块常面临数据库设计、密码加密、权限配置及用户体验等问题。本文以便利店销售系统为例,详细解析四大类问题:数据库字段约束(如默认值缺失)、密码加密(明文存储风险)、Spring Security配置(路径权限不当)以及表单交互(数据丢失与提示不足)。通过优化数据库结构、引入BCrypt加密、完善安全配置和改进用户交互,提供了一套全面的解决方案,助力开发者构建更 robust 的系统。
351 0
|
Java 中间件
SpringBoot入门(6)- 添加Logback日志
SpringBoot入门(6)- 添加Logback日志
455 5
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
1208 2
|
10月前
|
JSON 前端开发 Java
深入理解 Spring Boot 中日期时间格式化:@DateTimeFormat 与 @JsonFormat 完整实践
在 Spring Boot 开发中,处理前后端日期交互是一个常见问题。本文通过 **@DateTimeFormat** 和 **@JsonFormat** 两个注解,详细讲解了如何解析前端传来的日期字符串以及以指定格式返回日期数据。文章从实际案例出发,结合代码演示两者的使用场景与注意事项,解决解析失败、时区偏差等问题,并提供全局配置与局部注解的实践经验。帮助开发者高效应对日期时间格式化需求,提升开发效率。
3112 2
|
12月前
|
前端开发 Java Nacos
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
本文介绍了如何使用Spring Cloud Alibaba 2023.0.0.0技术栈构建微服务网关,以应对微服务架构中流量治理与安全管控的复杂性。通过一个包含鉴权服务、文件服务和主服务的项目,详细讲解了网关的整合与功能开发。首先,通过统一路由配置,将所有请求集中到网关进行管理;其次,实现了限流防刷功能,防止恶意刷接口;最后,添加了登录鉴权机制,确保用户身份验证。整个过程结合Nacos注册中心,确保服务注册与配置管理的高效性。通过这些实践,帮助开发者更好地理解和应用微服务网关。
2118 0
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
823 5
|
安全 Java 数据安全/隐私保护
如何使用Spring Boot进行表单登录身份验证:从基础到实践
如何使用Spring Boot进行表单登录身份验证:从基础到实践
423 5
|
监控 Java 数据安全/隐私保护
如何用Spring Boot实现拦截器:从入门到实践
如何用Spring Boot实现拦截器:从入门到实践
789 5

热门文章

最新文章