Java EE进阶7:Spring Boot 日志

1.日志概述

1.1 为什么要学习日志

1.2 日志的用途

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

下图中的数据源,其中一部分就来自于日志记录的数据。


2.日志使用

Spring Boot 项目在启动的时候默认就有日志输出,如下图所示:

它打印的日志和 System.out.print 有什么不同呢?

java 复制代码
@RestController
public class LoggerController {
    @RequestMapping("/logger")
    public String logger(){
        System.out.println("打印⽇志");
        return "打印⽇志";
    }
}

**运行程序,调用接口(去网页刷新一下),打印日志,**观察日志输出。

可以看到,我们通过System.out.print 打印的日志,比SpringBoot 打印的日志缺少了很多信息。

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

2.1 打印日志

打印日志的步骤:先****在程序中得到日志对象,使用日志对象输出要打印的内容。

(1)在程序中得到日志对象

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

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

LoggerFactory.getLogger 需要传递一个参数, 标识这个⽇志的名称,这样可以更清晰的知道是**哪个类 输出的日志,**当有问题时,可以更方便直观的定位到问题类。

注意:Logger 对象是属于 org.slf4j 包下的,不要导入错包。


(2)使用日志对象打印日志

日志对象的打印方法有很多种,我们可以先使用 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);

    @RequestMapping("/logger")
    public String logger(){
        logger.info("--------------要输出⽇志的内容----------------");
        return "打印⽇志";
    }
}

打印日志效果展示:


2.2 日志框架介绍(了解)

SLF4J不同于其他日志框架,它不是一个 真正的日志实现,而是一个抽象层,日志框架制定的一种规范、标准、接口 ,所有SLF4J并不能 独立使用,需要和具体的日志框架配合使用。

(1)门面模式(外观模式)

门面模式的实现

**场景:**回家,我们会开各个屋的灯;离开家时,会关闭各个屋的灯。

如果家里设置⼀个总开关来控制整个屋的灯就会很方便,我们使用门面模式的实现。

java 复制代码
public class FacadePatternDemo {
    public static void main(String[] args) {
        LightFacade lightFacade = new LightFacade();
        lightFacade.lightOn();
    }
}

/**
 * 灯的⻔⾯
 */
class LightFacade{
    private Light livingRoomLight = new LivingRoomLight();
    private Light hallLight = new HallLight();
    private Light diningLight = new DiningLight();
    
    public void lightOn(){
        livingRoomLight.on();
        hallLight.on();
        diningLight.on();
    }
    public void lightOff(){
        livingRoomLight.off();
        hallLight.off();
        diningLight.off();
    }
}



//灯
interface Light {
    void on();
    void off();
}


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


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


/**
 * 餐厅灯 
 */
class DiningLight implements Light{
    @Override
    public void on() {
        System.out.println("打开餐厅灯");
    }
    @Override
    public void off() {
        System.out.println("关闭餐厅灯");
    }
}

(2)SLF4J框架介绍

SLF4J就是其他日志框架的门面, 可以理解为是**提供日志服务的统一API接口,**并不涉及到具体的日志逻辑实现。

不引入日志文件


引入日志文件

SLF4J 就是这个日志门面 ,SLF4J使你的代码独立于 任意⼀个特定的日志API,这是⼀个对于开发API的开发者很好的思想。

2.3 日志格式的说明

2.4 日志级别

(1)分类

(2)使用

日志级别是开发人员自己设置 的,开发人员根据自己的理解来判断该信息的重要程度。(类似公司管理,通常由领导来判断什么样的事情需要汇报,什么样的事情不需要汇报。)

针对这些级别,Logger对象 分别提供了对应的方法来输出日志。

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

}

若是想改变 日志的默认输出级别 ,就需要进行日志级别配置,只需要在配置文件中设置 "logging.level " 配置项即可,root 代表根目录 ,如果想在某个单独的目录中修改 ,只需要在 root 后面加上具体的目录以及级别。

【properties 和 yml 只需要配置其中一个即可,二 者转换方式-- Properties 文件的点( . ) 对应 yml 文件中的换行】

2.5 日志配置

后续的配置,properties 和 yml 只需要配置其中一个即可

(1)日志持久化

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

日志持久化有两种方式


注意: logging.file.namelogging.file.path 两个 配置的情况下,只生效其一,以 logging.file.name为准。

(2)配置日志文件分割

Properties配置

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

yml配置

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

1. 日志文件超过1KB就分割 (设置1KB是为了更好展示,企业开发通常设置为200M、500M等,此处没 有明确标准)

2. 分割后的日志文件名 为:日志名.日期.索引

(3)配置日志格式

配置项说明:



3.更简单的日志输出

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

1. 添加 lombok 框架支持

2. 使用@slf4j 注解输出日志。

添加 lombok 依赖

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

输出日志

java 复制代码
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RestController;


@Slf4j
@RestController
public class LogController {
    public void log(){
        log.info("--------------要输出⽇志的内容----------------");
    }
}

lombok 提供的 @Slf4j 会帮我们提供一个日志对象 log ,我们直接使用就可以。

相关推荐
耘田14 小时前
 macOS Launch Agent 定时任务实践指南
java·开发语言·macos
_loehuang_14 小时前
Docker Compose 部署 Maven 私有库 nexus3
java·docker·maven·nexus·maven私有库
while(1){yan}1 天前
Mybatis基础(详解)
spring boot·spring·java-ee·mybatis
韩立学长1 天前
【开题答辩实录分享】以《在线作业标准流程指导系统的设计与实现》为例进行选题答辩实录分享
java·javascript
一直都在5721 天前
Spring框架:AOP
java·后端·spring
sheji34161 天前
【开题答辩全过程】以 基于springboot的健身房管理系统为例,包含答辩的问题和答案
java·spring boot·后端
萧曵 丶1 天前
JAVA final 详解
java
林shir1 天前
Java基础2.2-Stream流
java
wadesir1 天前
C++基本数据类型详解(零基础掌握C++核心数据类型)
java·开发语言·c++