SpringBoot 日志

目录

一、日志概述

二、日志使用

[2.1 打印日志](#2.1 打印日志)

[2.2 日志格式](#2.2 日志格式)

[2.3 日志级别](#2.3 日志级别)

[2.4 日志配置](#2.4 日志配置)

[2.4.1 日志级别](#2.4.1 日志级别)

[2.4.2 日志持久化](#2.4.2 日志持久化)

[2.4.3 日志文件分割](#2.4.3 日志文件分割)

[2.4.4 配置日志格式](#2.4.4 配置日志格式)

三、更简单的日志输出

[3.1 添加 lombok 依赖](#3.1 添加 lombok 依赖)

[3.2 输出日志](#3.2 输出日志)


一、日志概述

在SpringBoot项目启动后,项目本身就有默认的日志输出,即:


那么如何自己打印如上的日志呢?

二、日志使用

SpringBoot 内置了日志框架 Slf4j,可以直接在程序中调用 Slf4j 来输出日志。

2.1 打印日志

打印日志的步骤:

  1. 在程序中得到日志对象;
  2. 使用日志对象输出要打印的内容。

在程序中获取日志对象需要使用日志工厂LoggerFactory,如下代码所示:

java 复制代码
private static Logger logger = LoggerFactory.getLogger(LoggerController.class);

Logger 对象是属于 org.slf4j 包下的,不要导入错包。
日志对象的打印方法有很多种,先使用 info() 方法来输出日志,如下代码所示:

java 复制代码
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class LoggerController {
 private static Logger logger = LoggerFactory.getLogger(LoggerController.class);

 @PostConstruct
 public String logger(){
      logger.info("info 日志");
       return "打印日志";
 }
}

2.2 日志格式

从上图可以看到,日志输出内容元素具体如下:

①. 时间日期:精确到毫秒

②. 日志级别:ERROR, WARN, INFO, DEBUG 或TRACE

③. 进程ID

④. 线程名

⑤. Logger名(通常使用源代码的类名)
⑥. 日志内容

2.3 日志级别

日志的级别从高到低依次为: FATAL、ERROR、WARN、INFO、DEBUG、TRACE。级别越高, 收到的消息越少。

  • FATAL: 致命信息,表示需要立即被处理的系统级错误。
  • ERROR: 错误信息, 级别较高的错误日志信息, 但仍然不影响系统的继续运行。
  • WARN: 警告信息, 不影响使用, 但需要注意的问题。
  • INFO: 普通信息, 用于记录应用程序正常运行时的一些信息, 例如系统启动完成、请求处理完成等。
  • DEBUG: 调试信息, 需要调试时候的关键信息打印。
  • TRACE: 追踪信息, 比DEBUG更细粒度的信息事件(除非有特殊用意,否则请使同DEBUG级别替代)。

那么可以通过以下代码实现不同级别的日志打印:

java 复制代码
/**
 * 打印不同级别的⽇志
 * @return
 */
@PostConstruct
public String printLog() {
 logger.trace("================= trace ===============");
 logger.debug("================= debug ===============");
 logger.info("================= info ===============");
 logger.warn("================= warn ===============");
 logger.error("================= error ===============");
 return "打印不同级别的⽇志" ;
}


结果发现, 只打印了info, warn和error级别的日志,这与日志级别的配置有关, 日志的输出级别默认是 info级别, 所以只会打印大于等于此级别的日志, 也就是info, warn和error。

2.4 日志配置

2.4.1 日志级别

日志级别配置只需要在配置文件中设置"logging.level"配置项即可。
在properties文件中:

java 复制代码
logging.level.root=debug

在yml文件中:

java 复制代码
logging:
 level:
  root: debug

配置完成之后,重新启动项目,运行上面代码,可发现:

2.4.2 日志持久化

以上的日志都是输出在控制台上的,然而在线上环境中需要把日志保存下来, 以便出现问题之后追溯问题。把日志保存下来就叫持久化。 日志持久化有两种方式:

  • 配置日志文件名
  • 配置日志的存储目录
  1. 配置日志文件的路径和文件名:
    properties配置 :

    logging.file.name=springboot.log

yml配置 :

复制代码
# 设置⽇志⽂件的⽂件名
logging: 
 file: 
  name: springboot.log

启动项目刷新之后会显示:


2. 配置日志文件的保存路径
properties配置

复制代码
logging.file.path=D:/temp

yml配置:

复制代码
# 设置⽇志⽂件的⽬录
logging:
 file:
  path: D:/temp

启动项目刷新之后会显示:


这种方式只能设置日志的路径, 文件名为固定的spring.log。
logging.file.name 和 logging.file.path 两个都配置的情况下, 只生效其一, 以 logging.file.name 为准。

2.4.3 日志文件分割

如果我们的日志都放在一个文件中, 随着项目的运行, 日志文件会越来越大, 需要对日志文件进行分割。 默认日志文件超过10M就进行分割。

配置项 说明 默认值
http://logging.logback.rollingpolicy.file-name-pattern 日志分割后的文件名格式 ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
http://logging.logback.rollingpolicy.max-file-size 日志文件超过这个大小就自动分割 10MB

配置日志文件分割:
properties配置 :

复制代码
logging.logback.rollingpolicy.file-name-pattern=${LOG_FILE}.%d{yyyy-MM-dd}.%i
logging.logback.rollingpolicy.max-file-size=1KB

yml配置 :

复制代码
logging:
 logback:
  rollingpolicy:
   max-file-size: 1KB
   file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i

日志文件超过1KB就分割,分割后的日志文件名为:日志名.日期.索引
项目运行, 多打印一些日志, 日志分割结果:

2.4.4 配置日志格式

目前日志打印的格式是默认的,打印日志的格式, 也是支持配置的,支持控制台和日志文件分别设置。

配置项 说明 默认值
http://logging.pattern.console 控制台日志格式 %clr(%d{{LOG_DATEFORMAT_PATTERN:-yyyy-MM dd'T'HH:mm:ss.SSSXXX}}){faint} %clr({LOG_LEVEL_PATTERN:- %5p}) %clr({PID:- }){magenta} %clr(---){faint} %clr(\[%15.15t\]) {faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n{LOG_EXCEPTION_CONVERSION_WORD:-%wEx}
http://logging.pattern.file 日志文件 的日志格 式 %d{{LOG_DATEFORMAT_PATTERN:-yyyy-MM dd'T'HH:mm:ss.SSSXXX}} {LOG_LEVEL_PATTERN:-%5p} {PID:- } --- \[%t\] %-40.40logger{39} : %m%n{LOG_EXCEPTION_CONVERSION_WORD:-%wEx}

配置项说明:

  1. %clr(表达式){颜色} 设置输入日志的颜色,支持颜色有:blue、cyan、faint、green、magenta 、red、yellow

  2. %d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}} 日期和时间--精确到毫秒

  3. %5p 显示日志级别ERROR,MARN,INFO,DEBUG,TRACE.

  4. %t 线程名,%c 类的全限定名,%M method,%L 为行号,%thread 线程名称,%m 或者 %msg 显示输出消息,%n 换行符

  5. %5 若字符长度小于5,则右边用空格填充,%-5 若字符长度小于5,则左边用空格填充. %.15 若字符长度超过15,截去多余字符,%15.15 若字符长度小于15,则右边用空格填充。 若字符长度超过15,截去多余字。
    如果设置了颜色,但是没有生效,那么就需要配置。以下步骤进行配置即可:



    "-Dspring.output.ansi.enabled=ALWAYS"

    重新启动程序便可解决问题。
    properties配置:

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

yml配置:

复制代码
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'

三、更简单的日志输出

每次都使用 LoggerFactory.getLogger(xxx.class) 很繁琐,,且每个类都添加一遍, lombok提供了一种更简单的方式。

  1. 添加 lombok 框架支持
  2. 使用 @slf4j 注解输出日志

3.1 添加 lombok 依赖

java 复制代码
<dependency>
 <groupId>org.projectlombok</groupId>
 <artifactId>lombok</artifactId>
 <optional>true</optional>
</dependency>

3.2 输出日志

java 复制代码
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
public class LogController {
 
 @PostConstruct
 public void log(){
 log.info("--------------要输出⽇志的内容----------------");
 }
}

运行结果如下:

相关推荐
北执南念14 分钟前
项目代码生成工具
java
中国lanwp20 分钟前
springboot logback 默认加载配置文件顺序
java·spring boot·logback
cherishSpring31 分钟前
在windows使用docker打包springboot项目镜像并上传到阿里云
spring boot·docker·容器
苹果酱05671 小时前
【Azure Redis 缓存】在Azure Redis中,如何限制只允许Azure App Service访问?
java·vue.js·spring boot·mysql·课程设计
Java致死1 小时前
单例设计模式
java·单例模式·设计模式
胡子发芽1 小时前
请详细解释Java中的线程池(ThreadPoolExecutor)的工作原理,并说明如何自定义线程池的拒绝策略
java
沫夕残雪1 小时前
Tomcat的安装与配置
java·tomcat
胡子发芽2 小时前
请解释Java中的NIO(New I/O)与传统I/O的区别,并说明NIO中的关键组件及其作用
java
小布不吃竹2 小时前
SpringMVC框架
spring·mvc
柚个朵朵2 小时前
IDEA中使用Git
java·git·spring