Spring Boot 日志

1. 日志概述

1.1 什么是日志

我们刚开始学习编程,写一些编程题时,我们使用print输出一些数据测试自己代码,这个输出的内容就可以称为日志。日志可以用来发现和定位问题,或者根据日志来分析程序的运行过程,在Spring的学习中,也经常通过控制台打印的日志来分析和定位问题。随着项目的复杂度提升,我们对日志打印有了更高的需求,不仅仅是用来排查问题,还可以用来记录一些用户的操作记录,用于分析用户的喜好,实现这样复杂的日志就需要使用一些专门的日志框架。

1.2 日志的用途

通过前面的学习,我们知道日志主要是为了发现问题,分析问题,定位问题,但除此之外,日志还有很多用途:

  • 系统监控:系统监控现在几乎是要给成熟系统的标配,我们可以通过日记录这个系统的运行状态,每个方法的响应时间,响应状态等,如果出现严重异常时能自动报警。
  • 数据采集:日志还可以用于采集一些数据,如页面/广告的点击量,记录用户的点击偏好。

2. 日志的使用

Spring Boot 项目在启动时,会默认有日志输出:

我们可以看到,Spring 输出的日志信息包含了很多内容,如果我们直接使用print输出日志的话,是没有这么多信息的。这是因为,Sprint Boot使用的日志框架slf4j来输出的日志。

2.1 打印日志

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/logger")
public class LoggerController {
    //使用日志工程创建日志对象,后面参数为日志的名称,
    //这里传入本类的类对象,用于标识这个日志是本类输出
    private static Logger logger = LoggerFactory.getLogger(LoggerController.class);
    @RequestMapping("/getLogger")
    public String getLogger() {
        System.out.println("直接输出日志");
        //输出日志
        logger.info("使用框架输出日志");
        return "success";
    }
}

2.2 日志框架

SLF4J不同于其他日志框架,它不是一个真正的日志实现,而是一个抽象层,对日志框架制定的一种规范标准,所有的SLF4J接口都需要和具体的日志框架配合使用。就相当于SLF4J对日志实现又进行了一层封装,这种模式称为门面模式(外观模式),SLF4J默认使用的日志实现是logback。

门面模式:提供一个统一的接口,用来访问子系统中的一群接口。这里的SLF4J就相当于门面,日志的具体实现就是子系统。

如果一个项目中已经使用了logback作为日志实现,现在这个项目引入了一个第三方库,这个第三方库使用了另一个日志实现,那么你的项目也必须引入这个日志实现,但是不同日志框架的API接口和配置文件不同,如果多个日志框架要共存,那么不得不维护多套配置文件,如果要更换日志框架,应用程序将不得不修改代码,并且修改过程可能会存在一些冲突。

引入日志门面之后,应用程序和日志框架之间有了统一的API接口,此时应用程序只需要维护一套配置文件即可,且当需要更换日志实现时,也不需要更改应用程序代码。

2.3 日志格式 

我们使用框架输出的日志会有很多信息,我们来解释一下这些信息的含义:

以第一行为例:

  1. 2024-03-31T10:52:07.099+08:00:日志输出的时间
  2. INFO:日志的级别
  3. 10096:进程ID
  4. [           main]:线程名
  5. o.s.b.w.embedded.tomcat.TomcatWebServer:日志名,通常使用源代码的类名
  6. Tomcat initialized with port 8080 (http):日志信息

2.4 日志级别

日志级别有以下几种:

  • TRACE:追踪信息用于输出最详细的调试信息,通常在开发和调试阶段使用,并且应根据需要在生产环境中合理地开启或关闭。

  • DEBUG:调试信息,仅在调试时使用,可输出详细的调试信息,但在生产环境中应禁用。

  • INFO:普通信息,用于输出关键操作的信息,可帮助追踪应用程序的状态和行为。

  • WARN:警告信息,表明潜在的问题,但不会影响应用程序的正常运行,需要引起注意并及时处理。

  • ERROR:错误信息,指示出现错误,但不会导致应用程序停止,需要及时处理以保证应用程序的稳定性。

  • FATAL:致命信息,表示致命的错误,会导致应用程序无法继续运行,需要立即处理以防止进一步损害。

日志的级别从上到下依次升高。

可以通过调用不同的方法打印不同级别的日志:

    @RequestMapping("/level")
    public String loggerLevel() {
        logger.trace("trace级别的日志");
        logger.debug("debug级别的日志");
        logger.info("info级别的日志");
        logger.warn("warn级别的日志");
        logger.error("error级别的日志");
        return "success";
    }

logback中将fatal级别的日志归类到了error级别,所有没有fatal级别的日志。

启动项目,访问level:

我们发现trace 和 debug级别的日志并没有出现, 这是因为我们项目的默认日志级别是INFO,所以只会输出INFO和比INFO级别更高的日志,要想输出trace和debug,我们需要设置默认日志级别:

可以在配置文件中输入:logging.level.*:日志级别  来更改默认日志级别,*代表路径,表示要对哪个路径下应用这个默认日志级别,root代表应用到整个项目

可以看到此时能正常输出DEBUG级别的日志了。 

2.5 日志持久化

当我们重启项目时,之前输出的日志会被清空,有时候我们并不希望这个日志被清空,于是我们可以在配置文件中写:logging.file.name:路径+文件名.log  就可以把日志储存在指定路径的文件里。

如果只写文件名则默认把日志文件放在项目路径中

2.6 日志分割

如果我们的日志都放在一个文件中,随着项目的运行,日志文件会越来越大,需要对日志文件进行分割:

logging:
  logback:
    rollingpolicy:
      max-file-size: 10KB
      file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i

表示日志文件大于10KB时自动分割出一个日志文件,新的日志文件名是:原日志名.时间.id(0,1,2...) 

3. 更简单的日志输出

lombok框架提供了@Sl4j 注解,可以让日志输出变得更简洁:

@Slf4j
@RestController
@RequestMapping("/logger2")
public class LoggerController2 {
    @RequestMapping("/level")
    public String loggerLevel() {
        log.trace("trace级别的日志");
        log.debug("debug级别的日志");
        log.info("info级别的日志");
        log.warn("warn级别的日志");
        log.error("error级别的日志");
        return "success";
    }
}

  • 31
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ting-yu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值