六.logback记录日志文件并按大小日期分割文件

文章目录


前言

通常我们项目中控制台能显示输出系统运行的日志,但是当我们的项目部署到线上环境的时候,我们一般需要要将日志记录保存成日志文件,方便线上排查问题和调试,此篇主要介绍如何通过配置springboot默认的日志框架logback来记录日志文件。


配置前先通俗点解释下日志框架

一、log4j,log4j2,logback,slf4j的关系?

这里通俗的一句话概括就是slf4j是一个抽象层的日志框架,它只负责定规范,不负责具体实现,那么其他的log4j,log4j2,logback就是slf4j的实现层框架;

Spring Boot默认使用SLF4J作为日志门面,并且默认集成了Logback日志实现框架

平常使用的时候就只需要调用slf4j接口即可,无需关心其具体实现,并且我们可以随意切换或配置不同的实现层框架。

二、使用logback配置自定义日志记录

1.引入库

这里我们使用的是logback,由于spring boot默认在spring-boot-starter包中就包含了该包的引用,所以无需再额外引入

2.创建配置文件logback-spring.xml

由于我们需要记录项目中所有模块的日志,故我们将配置文件放在light-common模块中,在resources目录中创建该配置文件,结构如图:

3.配置示例如下

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 引用默认日志配置 -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <!--使用默认的控制台日志输出实现-->
    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
    <!-- 应用名称 -->
    <springProperty scope="context" name="spring.application.name" source="spring.application.name" defaultValue="springBoot"/>

    <!-- 日志文件名称前缀,spring-boot-admin监控时要与yml配置的Actuator监控日志一致 -->
    <property name="log.file.prefix" value="${spring.application.name}"/>
    <!-- 日志文件路径 -->
    <property name="log.path" value="./logs"/>
    <!-- 日志最大的历史保留天数 -->
    <property name="maxHistory" value="7"/>
    <!-- 日志最大文件大小 -->
    <property name="maxFileSize" value="10MB"/>
    <!-- 字符集 -->
    <property name="charset" value="UTF-8"/>

    <!-- DEBUG 日志输出到文件 -->
    <appender name="file_debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
            <!--设置为默认的文件日志格式-->
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>${charset}</charset>
        </encoder>
        <!--滚动策略,SizeAndTimeBasedRollingPolicy必须加上maxFileSize属性-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 日志默认压缩路径,将超过指定文件大小的日志,进行存档,%d{yyyy-MM,aux}这个aux表示该%d是辅助配置,不需要按照此滚动打包,这样logback就可以按照后面的%d{yyyy-MM-dd}每日滚动打包 -->
            <fileNamePattern>${log.path}/%d{yyyy-MM,aux}/${log.file.prefix}-debug.%d{yyyy-MM-dd}.%i.log
            </fileNamePattern>
            <maxFileSize>${maxFileSize}</maxFileSize>
            <maxHistory>${maxHistory}</maxHistory>
        </rollingPolicy>
    </appender>

    <!-- ERROR 日志输出到文件 -->
    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
            <!--设置为默认的文件日志格式-->
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>${charset}</charset>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 日志默认压缩路径,将超过指定文件大小的日志,进行存档,%d{yyyy-MM,aux}这个aux表示该%d是辅助配置,不需要按照此滚动打包,这样logback就可以按照后面的%d{yyyy-MM-dd}每日滚动打包 -->
            <fileNamePattern>${log.path}/%d{yyyy-MM,aux}/${log.file.prefix}-error.%d{yyyy-MM-dd}.%i.log
            </fileNamePattern>
            <maxFileSize>${maxFileSize}</maxFileSize>
            <maxHistory>${maxHistory}</maxHistory>
        </rollingPolicy>
    </appender>

    <!-- 控制框架输出日志 -->
    <logger name="org.mybatis" level="INFO"/>
    <logger name="springfox" level="INFO"/>

    <!-- 根日志配置 -->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="file_debug"/>
        <appender-ref ref="file_error"/>
    </root>
</configuration>

总结

此文主要使用logback来记录日志,并结合自身项目需求来进行配置,如需使用其他log4j,log4j2来作为日志实现框架,配置有一定的区别,不在此介绍,请参考官网说明。

相关推荐
m0_587383005 分钟前
无人自助拼豆系统核心功能开发与部署落地全流程实战指南
java·经验分享·后端·struts·架构
雷一言说14 分钟前
Spring AI 2.0:RAG 文档分块大小策略选择
java·spring
XIAEE15 分钟前
Java 世界历险记:从一行 System.out.println 到整个 Spring 宇宙
java·spring
XIAEE17 分钟前
微前端狂想曲:我试图让三个不同门派的前端住进同一栋楼
java·spring
XIAEE17 分钟前
Linux 生存指南:从"终端恐惧症"到"命令行老司机"
java·spring
XIAEE18 分钟前
实战教程:手机端死活调不出摄像头?聊聊安全上下文(Secure Context)
java·spring
程序员清风18 分钟前
堆与优先队列:从 Top K 到任务调度
java·数据结构·算法
XIAEE24 分钟前
ES6 与 Node.js 群侠传:那些年我们追过的语法,和那些年把我们追杀的 API
java·spring
XIAEE24 分钟前
WebRTC 探险记:我是如何让两个浏览器"看对眼"的
java·spring
XIAEE29 分钟前
UniApp 本地打包通关记:Android 是地狱难度,iOS 是隐藏 BOSS
java·spring