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("--------------要输出⽇志的内容----------------");
 }
}

运行结果如下:

相关推荐
新手小袁_J6 分钟前
RabbitMQ的发布订阅模式
java·开发语言·redis·spring·缓存·java-rabbitmq
李逍遙️8 分钟前
Redisson实现分布式锁
spring boot·分布式·redisson
小笨猪-10 分钟前
RabbitMQ应用问题
java·redis·分布式·rabbitmq
paopaokaka_luck32 分钟前
[357]基于springboot的中小型制造企业质量管理系统
spring boot·后端·制造
码上一元1 小时前
缓存淘汰策略:Redis中的内存管理艺术
java·redis·缓存
cyt涛1 小时前
SpringCloudGateway — 网关路由
java·开发语言·网关·gateway·路由·断言·转发
2401_857600951 小时前
SpringBoot在线教育系统:性能优化策略
spring boot
睡觉谁叫1 小时前
一文解秘Rust如何与Java互操作
android·java·flutter·跨平台
漫天转悠1 小时前
windwos安装多版本Maven(图文详细版)
java·maven
慧都小妮子1 小时前
Spire.PDF for .NET【页面设置】演示:获取 PDF 文件中的页数
java·pdf·.net