六.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来作为日志实现框架,配置有一定的区别,不在此介绍,请参考官网说明。

相关推荐
座山雕~10 分钟前
每日一题----------多线程和并发
java·开发语言
支持未来23 分钟前
eclipse离线安装Grep console
java·ide·eclipse
哪吒编程24 分钟前
2个真实案例,揭示Java并发工具类的致命陷阱,ConcurrentHashMap也不是100%安全
java·后端
机器视觉—ing40 分钟前
C# 不同框架如何调用framework 和 net core
java·数据库·c#
李白的粉1 小时前
基于ssm的电子病历系统(全套)
java·毕业设计·ssm·课程设计·源代码·基于ssm的电子病历系统
一瓢一瓢的饮 alanchan1 小时前
通过AI自动生成springboot的CRUD以及单元测试与压力测试源码(一)
人工智能·spring boot·单元测试·压力测试·jpa·aicoder·java crud
小九没绝活1 小时前
设计模式-适配器模式
java·设计模式·适配器模式
希忘auto1 小时前
Spring Cloud之负载均衡之LoadBalance
java·spring cloud
川石课堂软件测试2 小时前
涨薪技术|Kubernetes(k8s)之Pod环境变量
java·功能测试·docker·云原生·容器·kubernetes·单元测试
ん贤2 小时前
【数据结构】栈与队列:基础 + 竞赛高频算法实操(含代码实现)
java·数据结构·c++·算法