# SpringBoot日志

# Logback

# 简介

Logback是SpringBootde默认框架,是 Log4j 的后继者,提供了比 Log4j 更好的性能和功能

Logback当前分成三个模块:

  • logback-core 是其它两个模块的基础模块。
  • logback-classic 是log4j的一个改良版本。它完整实现了SLF4J API。可以更换成其它日志系统如log4j。
  • logback-access 访问模块与Servlet (opens new window)容器集成提供通过Http来访问日志的功能。

# 核心组件

  • Logger: 日志的记录器,主要用于存放日志对象,也可以定义日志类型、级别。

  • Appender:用于指定日志输出的目的地,目的地可以是控制台、文件、数据库等。

  • Layout: 负责把事件转换成字符串,格式化的日志信息的输出。

在Logback中Layout对象被封装在encoder中。

# 配置文件

Logback提供了3种配置文件,默认加载顺序如下:

  • logback-test.xml
  • logback.groovy
  • logback.xml

如果都不存在则采用默认的配置

打印级别:TRACE<DEBUG<INFO<WARN<ERROR,默认DEBUG

配置文件示例:logback配置文件比较灵活,包含0或多个<appender>、0或多个<logger>、最多一个<root>元素

<?xml version="1.0" encoding="UTF-8" ?>
<!--文件命名为logback.xml或logback-spring.xml,建议logback-spring.xml-->

<!--
    scan: 是否启用配置文件自动扫描,默认false
    scanPeriod:配置文件自动扫描的时间间隔,格式为: "数字+空格+单位",如60 seconds, 2minutes,默认为1分钟
    debug: 启用 Logback 的调试模式,默认false
    packagingData: 每行日志都输出包信息其所在jar包信息
-->
<configuration scan="true" scanPeriod="60 seconds" debug="false" packingData="false">

    <!-- 从spring配置文件中读取变量并应用到本文件 -->
    <!--<springProperty name="size_max" source="size_max"/>-->
    <!--<springProperty name="days_max" source="days_max"/>-->

    <property name="size_max" value="100MB"/>
    <property name="days_max" value="365"/>

     <!-- windows 日志存储目录  和执行java -jar 命令时同级的 logs目录-->
    <property name="logDir" value="./logs"/>

    <!-- linux 日志存储目录 -->
    <!--    <property name="logDir" value="${user.dir}/../logs"/>-->

    <!-- 分隔符 -->
    <property name="separator" value="-"/>

    <!-- 设置日志格式 -->
    <property name="CONSOLE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} ${separator} %-5level ${separator} ${serverName}
        ${separator} ${PID} ${separator} ${HOSTNAME} ${separator} %X{requestId} ${separator} %-25logger{20} ${separator}
        %-4line ${separator} %msg%n"/>

    <!--控制台输出日志设置-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!--encoder:指定输出日志格式化和字符集-->
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>


    <!--输出到日志滚动文件-->
    <!--FileAppender将日志事件追加到指定日志文件中-->
    <!--使用RollingFileAppender,继承继承自FileAppender,支持日志分片和历史日志的自动删除-->
    <!--
    RollingFileAppender执行流程:
        1、日志始终追加写入指定的日志文件中,若文件不存在则自动创建
        2、按rollingPolicy配置的策略,当满足策略时,自动将file重命名为rollingPolicy中指定的归档日志文件名,生成历史归档日志,如 /temp/test.2023-04-12.log,并对归档日志进行压缩 和 过期日志删除。
        3、循环 1-2
    -->
    <appender name="infoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--日志文件的路径-->
        <File>${logDir}/info.log</File>

        <!--append:true | false,是否以追加的方式写到日志文件,默认true-->
        <append>true</append>

        <!--encoder:指定输出日志格式化和字符集-->
        <encoder>
            <charset>UTF-8</charset>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </encoder>

        <!--prudent:安全模式,性能较差,一般不开启,默认false-->
        <prudent>false</prudent>

        <!--滚动(归档)策略, TimeBasedRollingPolicy:按照时间滚动(归档),超出指定时间范围的日志自动删除;
                            SizeAndTimeBasedRollingPolicy:按时间和文件大小滚动(归档)
        -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中-->
            <FileNamePattern>${logDir}/arch/info/info.%d{yyyy-MM-dd}.%i.log</FileNamePattern>

            <!--日志保留时长(天)-->
            <maxHistory>${days_max}</maxHistory>

            <!--单个日志文件最大容量-->
            <maxFileSize>${size_max}</maxFileSize>

            <!--maxHistory内日志最大容量,到了这个值,就会删除旧的日志-->
            <!--<totalSizeCap>1GB</totalSizeCap>-->

            <!--cleanHistoryOnStart:项目启动时是否清理归档日志,默认false-->
            <cleanHistoryOnStart>false</cleanHistoryOnStart>
        </rollingPolicy>

    </appender>


    <!--将warn、error日志单独存储一份    -->
    <appender name="errorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">java
        <!--过滤器,过滤满足条件或者不满足条件的日志
            LevelFilter:级别过滤器,匹配指定的日志级别
            ThresholdFilter:阈值过滤器,匹配等于或高于指定级别的日志
        -->

        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>WARN</level>
        </filter>
        <!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则
            如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
            的日志改名为今天的日期。即,<File> 的日志都是当天的。
        -->
        <File>${logDir}/error.log</File>
        <!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
            <FileNamePattern>${logDir}/arch/error/error.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
            <!-- 单个日志文件大小 -->
            <maxFileSize>${size_max}</maxFileSize>
            <!--只保留最近多少天的日志-->
            <maxHistory>${days_max}</maxHistory>
            <!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
            <!--<totalSizeCap>1GB</totalSizeCap>-->
        </rollingPolicy>
        <!--日志输出编码格式化-->
        <encoder>
            <charset>UTF-8</charset>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>


    <!--
        name 指定记录日志的类的全限定名称
        level 指定级别,可以精细化定义每个类的日记记录方式
        additivity 是否将日志消息传递给父记录器,设置为false,避免重复输出
    -->
    <logger name="com.sw.controller" level="warn" additivity="false">
        <!-- ref 是前文定义的appender的name属性 -->
        <appender-ref ref="console"/>
    </logger>


    <!--建议在<root>中引用所有<appender>-->
    <root level="info">
        <appender-ref ref="console"/>
        <appender-ref ref="infoLog"/>
        <appender-ref ref="errorLog"/>
    </root>

</configuration>

# 日志输出格式

  • %-10level 级别 案例为设置10个字符,左对齐
  • %d{yyyy-MM-dd HH:mm:ss.SSS} 日期
  • %c 当前类全限定名
  • %M 当前执行日志的方法
  • %L 行号
  • %thread 线程名称
  • %m或者%msg 信息
  • %n 换行

# Log4j2

# JUL

Java Util Logging 是 Java 标准库自带的日志框架。

# SLF4J

SLF4J(Simple Logging Facade for Java)是一个日志门面,它允许你在不同的日志实现之间进行切换。

SLF4J 本身并不实现日志记录功能,它依赖于其他实际的日志实现

Last Updated: 12/23/2024, 4:18:13 AM