JavaEE之SpringBoot日志使用及说明

 更新时间:2026年01月08日 09:18:06   作者:苏小瀚  
文章介绍了日志的定义、作用、使用方法、日志框架、日志级别、日志配置以及使用注解@Slf4j简化日志打印的过程

1. 日志的介绍

日志就是程序在运行过程中记录下来程序所做的工作。

2. 日志的作用

系统监控,我们可以通过日志来记录系统的工作状况,及时发现问题。

数据采集,通过日志获取到用户请求的数据,对数据进行分析,进而推测出用户的特点。

日志审计,可以通过日志来判断一些网络安全问题。

3. 日志的使用

3.1 认识日志

我们在启动Spring Boot项目时候,就会发现控制台打印了很多日志,我们就分析下这些日志的结构:

如果我们在该项目的配置文件中,没有写下面的配置信息,此时打印的日志里面就不会显示项目名称:

spring:
  application:
    name: spring-captcha-demo

3.2 使用日志

我们创建一个类来打印日志:

Spring Boot给我们提供了一个打印日志的框架,我们直接使用就行,使用LoggerFactory类里面的getLogger方法,参数是类对象,来打印出来的日志就会显示是哪个类打印的日志,然后调用日志对象的info方法,输入日志内容,就会打印出来日志。

package com.sias.log.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/log")
@RestController
public class LogController {
    //生成一个日志对象
    private Logger logger = LoggerFactory.getLogger(LogController.class);

    @RequestMapping("/print")
    public String print() {
        //普通输出打印日志
        System.out.println("打印日志");
        //使用info方法打印日志
        logger.info("打印日志");
        return "打印日志";
    }
}

打印结果:

使用info方法打印出来的日志,格式就是Spring Boot自带的格式。

3.3 日志框架介绍

  • 日志门面: SLF4J
  • 日志实现:log4J  JUL  logback

这里的日志门面相当于是一种规范,不具体实现操作,而是直接调用日志实现的框架,具体的操作实现由下面三个框架去实现。

门面模式介绍

上面的这种设计模式就是门面模式,提供一个统一的接口去使用,这个接口再去调用其他子接口,更方便的去调用子接口。

比如我们想要关家里的灯,但是需要关很多开关但是此时我们可以设置一个总开关,来控制所有的灯,直接关闭这个总开关就可以关闭所有的灯。

代码简单实现:

控制所有子接口的类:

package com.sias.log.facade;

public class FacadeClient {
    private BedRoomLight bedRoomLight = new BedRoomLight();
    private LivingRoomLight livingRoomLight = new LivingRoomLight();
    private HallLight hallLight = new HallLight();

    //开灯
    void on() {
        bedRoomLight.on();
        livingRoomLight.on();
        hallLight.on();
    }
    //关灯
    void off() {
        bedRoomLight.off();
        livingRoomLight.off();
        hallLight.off();
    }
}

子接口类:

public class BedRoomLight implements Light {
    @Override
    public void on() {
        System.out.println("打开卧室灯");
    }

    @Override
    public void off() {
        System.out.println("关闭卧室灯");
    }
}
public class LivingRoomLight implements Light {
    @Override
    public void on() {
        System.out.println("打开客厅灯");
    }

    @Override
    public void off() {
        System.out.println("关闭客厅灯");
    }
}
public class HallLight implements Light {
    @Override
    public void on() {
        System.out.println("打开走廊灯");
    }

    @Override
    public void off() {
        System.out.println("关闭走廊灯");
    }
}

我们就可以在main方法调用这个总接口:

public class Main {
    public static void main(String[] args) {
        FacadeClient facadeClient = new FacadeClient();
        facadeClient.on();
        facadeClient.off();
    }
}

而在Spring Boot中使用的是SLF4J+logback框架,来进行打印日志的。

3.4 日志级别

日志的级别由高到低分为:

  • FATAL:致命错误,表示必须立即处理的错误。
  • ERROR:错误信息,级别较高的错误信息,不影响程序正常运行。
  • WARN:警告信息,不影响使用,需要注意的问题。
  • INFO:普通信息,用于记录程序正常运行时的信息,比如:系统启动完成,请求处理完成等。
  • DEBUG:调试信息,需要调试时候的关键信息打印。
  • TRACE:追踪信息,一般不使用。

Spring Boot默认的打印日志的级别是INFO级别。

我们可以调用对应的方法来打印不同级别的日志:

package com.sias.log.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/log")
@RestController
public class LogController {
    //生成一个日志对象
    private Logger logger = LoggerFactory.getLogger(LogController.class);

    @RequestMapping("/print")
    public String print() {
        //普通输出打印日志
        System.out.println("打印日志");
        //使用info方法打印日志
        logger.info("打印日志");
        
        logger.error("error");
        logger.warn("warn");
        logger.info("info");
        logger.debug("gebug");
        logger.trace("trace");
        return "打印日志";
    }
}

输出结果:

这里fatal级别日志就没有对应的方法,如果真发生严重错误就不需要靠日志来进行提醒了。

这里控制台只打印到info,因为默认是info及以上的日志才会打印。

3.5 日志配置

配置日志级别

我们可以在配置文件里面修改日志的级别:

我们还可以设置某个具体的包下面的代码的打印日志的级别:

这里就是在具体某个包下打印的日志是debug级别的。

logging:
  level:
    root: info
    com:
      sias:
        log:
          controller: debug

日志的持久化

我们可以把打印的日志保存下来,通过设置配置文件将日志保存在文件里面:

logging:
  file:
    name: log.log

打印结果存储在log.log文件里面:

这里name还可以设置目录:

logging:
  file:
    name: dee/log.log

还有一个path属性设置路径:

logging:
  file:
    path: pa/log

使用这个属性只能设置路径,文件名字是固定的spring.log

如果path和name两个属性同时存在,此时就会使用name属性设置的值。

日志的分割

我们在存储日志时候,默认情况下当一个文件大小超过10MB,此时就会分割,存储到一个新的文件里面,我们也可以设置这个分页的阈值:

logging:
  level:
    root: debug
  file:
    name: ff/log.log
  logback:
    rollingpolicy:
      max-file-size: 1KB

默认分开后的文件是个压缩文件,我们也可以通过配置去修改分开后的文件名和类型:

logging:
  level:
    root: debug
  file:
    name: ff/log.log
  logback:
    rollingpolicy:
      max-file-size: 1KB
      file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i

日志格式的修改

我们可以修改控制台的日志格式和日志文件中的日志格式:

  • %clr(表达式){yanse} 设置输入日志的颜色。
  • %d{${时间格式}} 日期和时间--精确到毫秒。
  • %5p 显示日志级别
  • %t 线程名 %c 类的全限定名  %M method
  • %L 行号 %thread 线程名称 %m/%msg 显示输出消息 %n换行符
  • %5 如果字符串长度小于5,右边用空格填充,%-5字符串长度小于5,左边用空格填充。
  • %.15字符串长度大于15,截取多余字符。
  • %15.15字符串长度小于15,右边用空格填充,字符串长度大于15,截取多余字符。

我们可以看到默认日志设置了颜色,但是控制台显示的都是黑色,这里需要修改设置:

按照下面步骤操作:

最后点击OK,就好了。

我们就可以使用上面的两个属性来修改格式:

logging:
  pattern:
    console: '%d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n'
    file: '%d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n'

此时打印的日志格式如下:

3.6 使用注解@Slf4j注解

我们在使用@Slf4j注解时候,需要添加下面的依赖:

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>

我们通过上面发现,我们打印日志时候,需要先创建一个打印日志的对象,还要填入类对象的参数,这个过程就可以使用@Slf4j注解来解决。

原来的代码:

@RequestMapping("/log")
@RestController
public class LogController {
    //生成一个日志对象
    private Logger logger = LoggerFactory.getLogger(LogController.class);

    @RequestMapping("/print")
    public String print() {
        //普通输出打印日志
        System.out.println("打印日志");
        //使用info方法打印日志
        logger.info("打印日志");

        logger.error("error");
        logger.warn("warn");
        logger.info("info");
        logger.debug("gebug");
        logger.trace("trace");
        return "打印日志";
    }
}

修改后的代码:

此时使用@Slf4j注解就会生成一个log的注解对象,对应上面的logger对象,可以打印日志。

@Slf4j
@RequestMapping("/log2")
@RestController
public class LogController2 {
    @RequestMapping("/print")
    public String print() {
        log.error("error");
        log.warn("warn");
        log.info("info");
        log.debug("gebug");
        log.trace("trace");
        return "打印日志";
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java+Springboot搭建一个在线网盘文件分享系统

    Java+Springboot搭建一个在线网盘文件分享系统

    本主要介绍了通过springboot+freemark+jpa+MySQL实现的在线网盘文件分享系统,其功能跟百度网盘非常类似,可以实现文件的上传、移动、复制、下载等,需要的可以参考一下
    2021-11-11
  • Java RabbitMQ消息队列详解常见问题

    Java RabbitMQ消息队列详解常见问题

    消息队列是最古老的中间件之一,从系统之间有通信需求开始,就自然产生了消息队列。本文告诉什么是消息队列,为什么需要消息队列,常见的消息队列有哪些,RabbitMQ的部署和使用
    2022-07-07
  • Spring为何要用三级缓存来解决循环依赖问题

    Spring为何要用三级缓存来解决循环依赖问题

    这篇文章主要给大家介绍了关于Spring为何要用三级缓存来解决循环依赖问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • RestTemplate使用不当引发的问题及解决

    RestTemplate使用不当引发的问题及解决

    这篇文章主要介绍了RestTemplate使用不当引发的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • SpringBoot Devtools实现项目热部署的方法示例

    SpringBoot Devtools实现项目热部署的方法示例

    这篇文章主要介绍了SpringBoot Devtools实现项目热部署的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • Event Sourcing事件溯源模式优化业务系统

    Event Sourcing事件溯源模式优化业务系统

    这篇文章主要为大家介绍了Event Sourcing事件溯源模式优化业务系统示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • java各种流的常见使用方法及示例

    java各种流的常见使用方法及示例

    在java中所有数据都是使用流读写的,流是一组有序的数据序列,将数据从一个地方带到另一个地方,这篇文章主要介绍了java各种流的常见使用方法及示例的相关资料,需要的朋友可以参考下
    2026-03-03
  • 使用SpringBoot+Prometheus+Grafana实现可视化监控

    使用SpringBoot+Prometheus+Grafana实现可视化监控

    本文主要给大家介绍了如何使用Spring actuator+监控组件prometheus+数据可视化组件grafana来实现对Spring Boot应用的可视化监控,文中有详细的代码供大家参考,具有一定的参考价值,需要的朋友可以参考下
    2024-02-02
  • RabbitMQ高级特性之死信队列深入解析

    RabbitMQ高级特性之死信队列深入解析

    死信队列(DeadLetterQueue, DLQ)是存储那些无法被正常消费或处理的消息的特殊队列,应用场景包括消息重试、消息丢弃和日志收集,本文给大家介绍RabbitMQ高级特性之死信队列的相关知识,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • Java三大结构解析之顺序、选择、循环详解

    Java三大结构解析之顺序、选择、循环详解

    Java中的for循环是一种迭代控制结构,通过初始化、条件判断和迭代更新三个步骤,实现对代码块的重复执行,这篇文章主要介绍了Java三大结构解析之顺序、选择、循环的相关资料,需要的朋友可以参考下
    2025-11-11

最新评论