IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> spring boot 日志系统 -> 正文阅读

[Java知识库]spring boot 日志系统

1. spring boot 所使用的日志系统

??spring boot 默认就是使用 SLF4J 作为日志门面,logback 作为日志实现来记录日志。

2. spring boot 中的日志设计

(1) 需要导入的 maven 依赖

??在 spring boot 中,日志依赖已经集成于 web 依赖里面。所以我们只需要导入下面的 maven 依赖即可

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

(2) 依赖关系图

??spring boot 中的日志依赖(因为 web 依赖里面已经包含了下面的 logging 依赖,所以不需要单独导入了)

<dependency> 
    <artifactId>spring-boot-starter-logging</artifactId> 
    <groupId>org.springframework.boot</groupId> 
</dependency>

在这里插入图片描述

(3) 总结

  • spring boot 底层默认使用 logback 作为日志实现
  • 使用了 SLF4J 作为日志门面
  • 可以将 JUL 转换为 slf4j
  • 也可以使用 log4j2 作为日志门面,但是最终也是通过 slf4j 调用 logback

3. spring boot 中测试打印日志

(1) 第一种打印日志的方法

package com.peng.test;

import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class LogTest {
    // 声明日志记录器对象
    private static final Logger LOGGER = LoggerFactory.getLogger(LogTest.class);

    @Test
    public void contextLoad() {
        // 打印日志信息
        LOGGER.error("error");
        LOGGER.warn("warn");
        LOGGER.info("info"); // 默认日志级别。如果不做控制,控制台默认打印 error、warn、info 的信息
        LOGGER.debug("debug");
        LOGGER.trace("trace");

        // 使用占位符输出日志信息
        String name = "wang";
        Integer age = 18;
        LOGGER.info("用户:{},{}", name, age);

        // 将系统的异常信息输出
        try {
            int i = 1/0;
        } catch (Exception e) {
            // e.printStackTrace();
            LOGGER.error("出现异常:", e);
        }
    }
}

(2) 第二种打印日志的方法

??引入 maven 依赖

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>
package com.peng.test;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
@Slf4j
public class LogTest {

    @Test
    public void contextLoad() {
        // 打印日志信息
        log.error("error");
        log.warn("warn");
        log.info("info"); // 默认日志级别。如果不做控制,控制台默认打印 error、warn、info 的信息
        log.debug("debug");
        log.trace("trace");

        // 使用占位符输出日志信息
        String name = "wang";
        Integer age = 18;
        log.info("用户:{},{}", name, age);

        // 将系统的异常信息输出
        try {
            int i = 1/0;
        } catch (Exception e) {
            // e.printStackTrace();
            log.error("出现异常:", e);
        }
    }
}

4. 在 spring boot 中配置日志信息

??当 spring boot 使用 logback 作为日志实现时。我们在 resources 目录下创建 logback-spring.xml 来配置日志信息的输出

(1) 控制台日志输出基本配置

??logback-spring.xml 的内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!--
        配置集中管理的属性
        后面其它标签使用时,可以直接使用该属性的 value 值
        格式:${name}
    -->
    <property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m %n"/>
    <!--
        日志输出格式:
            %-5level:日志级别,-5是占 5 个字符,不足向左对齐
            %d{yyyy-MM-dd HH:mm:ss.SSS}:日期
            %c:类的完整名称
            %M:当前执行日志的方法
            %L:为行号
            %thread:线程名称
            %m或者%msg:日志的具体信息
            %n:换行
    -->

    <!--控制台日志输出 appender-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!--控制输出流对象 默认 System.out 修改为 System.err(红色)-->
        <target>System.err</target>
        <!--日志消息格式配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <!--日志记录器 logging-->
    <!--如果 level 的值是 All 指的是所有级别的日志都输出-->
    <root level="info">
        <appender-ref ref="console"/>
    </root>

</configuration>

(2) 控制台 + 日志文件输出配置

??logback-spring.xml 的内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!--
        配置集中管理的属性
        后面其它标签使用时,可以直接使用该属性的 value 值
        格式:${name}
    -->
    <property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m %n"/>
    <!--
        日志输出格式:
            %-5level:日志级别,-5是占 5 个字符,不足向左对齐
            %d{yyyy-MM-dd HH:mm:ss.SSS}:日期
            %c:类的完整名称
            %M:当前执行日志的方法
            %L:为行号
            %thread:线程名称
            %m或者%msg:日志的具体信息
            %n:换行
    -->

    <!--定义日志文件保存路径的属性-->
    <property name="log_dir" value="E:"/>

    <!--控制台日志输出 appender-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!--控制输出流对象 默认 System.out 修改为 System.err(红色)-->
        <target>System.err</target>
        <!--日志消息格式配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <!--日志文件输出的 appender-->
    <appender name="file" class="ch.qos.logback.core.FileAppender">
        <!--日志文件的保存路径-->
        <file>${log_dir}\logback.log</file>
        <!--日志消息格式配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <!--日志记录器 logging-->
    <!--如果 level 的值是 All 指的是所有级别的日志都输出-->
    <root level="info">
        <appender-ref ref="console"/>
        <appender-ref ref="file"/>
    </root>

</configuration>

(3) 控制台、日志文件、html文件输出配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!--
        配置集中管理的属性
        后面其它标签使用时,可以直接使用该属性的 value 值
        格式:${name}
    -->
    <property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m %n"/>
    <!--
        日志输出格式:
            %-5level:日志级别,-5是占 5 个字符,不足向左对齐
            %d{yyyy-MM-dd HH:mm:ss.SSS}:日期
            %c:类的完整名称
            %M:当前执行日志的方法
            %L:为行号
            %thread:线程名称
            %m或者%msg:日志的具体信息
            %n:换行
    -->

    <!--定义日志文件保存路径的属性-->
    <property name="log_dir" value="E:"/>

    <!--控制台日志输出 appender-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!--控制输出流对象 默认 System.out 修改为 System.err(红色)-->
        <target>System.err</target>
        <!--日志消息格式配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <!--日志文件输出的 appender-->
    <appender name="file" class="ch.qos.logback.core.FileAppender">
        <!--日志文件的保存路径-->
        <file>${log_dir}\logback.log</file>
        <!--日志消息格式配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <!--html 文件日志输出-->
    <appender name="htmlFile" class="ch.qos.logback.core.FileAppender">
        <!--日志文件的保存路径-->
        <file>${log_dir}\logback.html</file>
        <!--html 日志格式的配置-->
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="ch.qos.logback.classic.html.HTMLLayout">
                <pattern>%-5level%d{yyyy-MM-dd HH:mm:ss.SSS}%c%M%L%thread%m</pattern>
            </layout>
        </encoder>
    </appender>

    <!--日志记录器 logging-->
    <!--如果 level 的值是 All 指的是所有级别的日志都输出-->
    <root level="info">
        <appender-ref ref="console"/>
        <appender-ref ref="file"/>
        <appender-ref ref="htmlFile"/>
    </root>

</configuration>

(4) 日志文件的拆分输出配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!--
        配置集中管理的属性
        后面其它标签使用时,可以直接使用该属性的 value 值
        格式:${name}
    -->
    <property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m %n"/>
    <!--
        日志输出格式:
            %-5level:日志级别,-5是占 5 个字符,不足向左对齐
            %d{yyyy-MM-dd HH:mm:ss.SSS}:日期
            %c:类的完整名称
            %M:当前执行日志的方法
            %L:为行号
            %thread:线程名称
            %m或者%msg:日志的具体信息
            %n:换行
    -->

    <!--定义日志文件保存路径的属性-->
    <property name="log_dir" value="E:"/>

    <!--控制台日志输出 appender-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!--控制输出流对象 默认 System.out 修改为 System.err(红色)-->
        <target>System.err</target>
        <!--日志输出格式配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <!--日志文件拆分输出的 appender-->
    <appender name="rollFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日志文件的保存路径-->
        <file>${log_dir}\roll_logback.log</file>
        <!--日志输出格式配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
        <!--指定拆分规则-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--按照时间节点把 roll_logback.log 日志文件进行拆分  下面是以秒单位进行拆分,也可以以分、小时、天等进行拆分。%i 指的是按照文件大小拆分文件的顺序,从 0 开始-->
            <fileNamePattern>${log_dir}\rolling.%d{yyyy-MM-dd-HH-mm-ss}.%i.log</fileNamePattern>
            <!--文件拆分大小:如果这个时间点的文件大小超过 10M,则分开存-->
            <maxFileSize>10MB</maxFileSize>
        </rollingPolicy>
    </appender>

    <!--日志记录器 logging-->
    <!--如果 level 的值是 All 指的是所有级别的日志都输出-->
    <root level="info">
        <appender-ref ref="console"/>
        <appender-ref ref="rollFile"/>
    </root>

</configuration>

(5) 日志过滤器配置

??给每个 appender 对象指定一个过滤器,让每个 appender 输出我们指定的日志级别

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!--
        配置集中管理的属性
        后面其它标签使用时,可以直接使用该属性的 value 值
        格式:${name}
    -->
    <property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m %n"/>
    <!--
        日志输出格式:
            %-5level:日志级别,-5是占 5 个字符,不足向左对齐
            %d{yyyy-MM-dd HH:mm:ss.SSS}:日期
            %c:类的完整名称
            %M:当前执行日志的方法
            %L:为行号
            %thread:线程名称
            %m或者%msg:日志的具体信息
            %n:换行
    -->

    <!--定义日志文件保存路径的属性-->
    <property name="log_dir" value="E:"/>

    <!--控制台日志输出 appender-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!--控制输出流对象 默认 System.out 修改为 System.err(红色)-->
        <target>System.err</target>
        <!--日志输出格式配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <!--日志文件拆分输出的 appender-->
    <appender name="rollFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日志文件的保存路径-->
        <file>${log_dir}\roll_logback.log</file>
        <!--日志输出格式配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
        <!--指定拆分规则-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--按照时间节点把 roll_logback.log 日志文件进行拆分  下面是以秒单位进行拆分,也可以以分、小时、天等进行拆分。%i 指的是按照文件大小拆分文件的顺序,从 0 开始-->
            <fileNamePattern>${log_dir}\rolling.%d{yyyy-MM-dd-HH-mm-ss}.%i.log</fileNamePattern>
            <!--文件拆分大小:如果这个时间点的文件大小超过 10M,则分开存-->
            <maxFileSize>10MB</maxFileSize>
        </rollingPolicy>
        <!--日志级别过滤器-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!--日志过滤规则,下面的规则是只输出 info 日志-->
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--日志记录器 logging-->
    <!--如果 level 的值是 All 指的是所有级别的日志都输出-->
    <root level="info">
        <appender-ref ref="console"/>
        <appender-ref ref="rollFile"/>
    </root>

</configuration>

(6) 异步日志的输出

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!--
        配置集中管理的属性
        后面其它标签使用时,可以直接使用该属性的 value 值
        格式:${name}
    -->
    <property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m %n"/>
    <!--
        日志输出格式:
            %-5level:日志级别,-5是占 5 个字符,不足向左对齐
            %d{yyyy-MM-dd HH:mm:ss.SSS}:日期
            %c:类的完整名称
            %M:当前执行日志的方法
            %L:为行号
            %thread:线程名称
            %m或者%msg:日志的具体信息
            %n:换行
    -->

    <!--定义日志文件保存路径的属性-->
    <property name="log_dir" value="E:"/>

    <!--控制台日志输出 appender-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!--控制输出流对象 默认 System.out 修改为 System.err(红色)-->
        <target>System.err</target>
        <!--日志输出格式配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <!--日志文件拆分输出的 appender-->
    <appender name="rollFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日志文件的保存路径-->
        <file>${log_dir}\roll_logback.log</file>
        <!--日志输出格式配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
        <!--指定拆分规则-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--按照时间节点把 roll_logback.log 日志文件进行拆分  下面是以秒单位进行拆分,也可以以分、小时、天等进行拆分-->
            <fileNamePattern>${log_dir}\rolling.%d{yyyy-MM-dd-HH-mm-ss}.%i.log</fileNamePattern>
            <!--文件拆分大小:如果这个时间点的文件大小超过 10M,则分开存-->
            <maxFileSize>10MB</maxFileSize>
        </rollingPolicy>
    </appender>

    <!--异步日志的输出 appender-->
    <appender name="async" class="ch.qos.logback.classic.AsyncAppender">
        <!--指定某个具体的 appender 对象进行异步输出日志-->
        <appender-ref ref="rollFile"/>
    </appender>

    <!--日志记录器 logging-->
    <!--如果 level 的值是 All 指的是所有级别的日志都输出-->
    <root level="info">
        <appender-ref ref="console"/>
        <appender-ref ref="async"/>
    </root>

</configuration>

5. spring boot 不同运行环境配置不同日志保存路径

(1) 在 application.yaml 的配置文件中指定不同的运行环境

??开发环境(dev)

spring:
  profiles:
    active: dev

??生产环境(prod)

spring:
  profiles:
    active: prod

(2) 配置不同环境的日志文件保存路径的配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!--
        配置集中管理的属性
        后面其它标签使用时,可以直接使用该属性的 value 值
        格式:${name}
    -->
    <property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m %n"/>
    <!--
        日志输出格式:
            %-5level:日志级别,-5是占 5 个字符,不足向左对齐
            %d{yyyy-MM-dd HH:mm:ss.SSS}:日期
            %c:类的完整名称
            %M:当前执行日志的方法
            %L:为行号
            %thread:线程名称
            %m或者%msg:日志的具体信息
            %n:换行
    -->

    <!--定义日志文件保存路径的属性-->
    <springProfile name="dev">
        <!--在 dev 环境时保存的路径-->
        <property name="log_dir" value="E:"/>
    </springProfile>
    <springProfile name="prod">
        <!--在 prod 环境时保存的路径-->
        <property name="log_dir" value="E:\aaa"/>
    </springProfile>

    <!--控制台日志输出 appender-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!--控制输出流对象 默认 System.out 修改为 System.err(红色)-->
        <target>System.err</target>
        <!--日志输出格式配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
    </appender>

    <!--日志文件拆分输出的 appender-->
    <appender name="rollFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日志文件的保存路径-->
        <file>${log_dir}\roll_logback.log</file>
        <!--日志输出格式配置-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${pattern}</pattern>
        </encoder>
        <!--指定拆分规则-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--按照时间节点把 roll_logback.log 日志文件进行拆分  下面是以秒单位进行拆分,也可以以分、小时、天等进行拆分。%i 指的是按照文件大小拆分文件的顺序,从 0 开始-->
            <fileNamePattern>${log_dir}\rolling.%d{yyyy-MM-dd-HH-mm-ss}.%i.log</fileNamePattern>
            <!--文件拆分大小:如果这个时间点的文件大小超过 10M,则分开存-->
            <maxFileSize>10MB</maxFileSize>
        </rollingPolicy>
    </appender>

    <!--日志记录器 logging-->
    <!--如果 level 的值是 All 指的是所有级别的日志都输出-->
    <root level="info">
        <appender-ref ref="console"/>
        <appender-ref ref="rollFile"/>
    </root>

</configuration>
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-19 11:51:57  更:2022-05-19 11:52:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/31 13:47:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码