MeteorCat / Logback配置

Created Wed, 07 May 2025 22:21:20 +0800 Modified Wed, 29 Oct 2025 23:25:00 +0800
1345 Words

虽然 Spring 全家桶直接编写 application.yml 就可以配置日志等级, 但是在后续脱离 spring 就需要另外采用其他日志配置, 一般就是采用 logback 来处理.

需要注意每个版本 logback 或者日志实现可能变动很大, 所以在升级或者更换实现的时候要留意

这里先引入依赖第三方需求库:


<dependencies>
    <!-- logback配置: 1.5.18版本 -->
    <!-- 默认会引入: slf4j-api  -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.5.18</version>
    </dependency>

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>1.5.18</version>
    </dependency>
</dependencies>

之后就是在 src/main/resources 创建 logback.xml 配置, 而外部 jar 包启动加载配置稳健这可以采用以下启动配置:

# 启动的时候加载 logback.xml 配置
java -jar -Dlogging.config="/etc/fusion/websocket-logback.xml" test.jar

而其中需要知道日志等级涵盖有: OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE, 这里想设计个最基础的配置:

<?xml version="1.0" encoding="UTF-8"?>
<!-- scan: 当此属性设置为true时, 配置文件如果发生改变将会被重新加载, 默认值为true -->
<!-- scanPeriod: 设置监测配置文件是否有修改的时间间隔, 如果没有给出时间单位默认单位是毫秒; 当scan为true时, 此属性生效. 默认的时间间隔为1分钟. -->
<!-- debug: 当此属性设置为true时, 将打印出logback实时logback运行状态. 默认值为false -->
<configuration scan="true" scanPeriod="120 seconds" debug="false">


    <!-- 定义日志变量对象 Start -->

    <!-- 日志应用名称 -->
    <!-- 这里默认会去加载 FUSION_LOG_NAME 环境变量, 如果不存在就默认加载 fusion 字符串  -->
    <property name="LOG_NAME" value="${FUSION_LOG_NAME:-fusion}"/>

    <!-- 日志放置目录 -->
    <!-- 这里默认会去加载 FUSION_LOG_DIR 环境变量, 如果不存在就默认加载 ./logs 目录  -->
    <property name="LOG_DIR" value="${FUSION_LOG_DIR:-./logs}"/>

    <!-- 日志文件编码 -->
    <!-- 默认读取外部 FUSION_LOG_CHARSET 变量 -->
    <property name="LOG_CHARSET" value="${FUSION_LOG_CHARSET:-UTF-8}"/>

    <!-- 日志等级 -->
    <!-- 默认读取外部 FUSION_LOG_LEVEL 变量 -->
    <property name="LOG_LEVEL" value="${FUSION_LOG_LEVEL:-WARN}"/>

    <!-- 定义日志变量对象 End -->


    <!-- 定义处理日志控制器: 命令行输出 -->
    <!-- name: 声明处理器名称 -->
    <!-- class: 声明调用的处理句柄 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期, %thread表示线程名, %-5level:级别从左显示5个字符宽度, %msg:日志消息, %n是换行符-->
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [${LOG_NAME}] [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>${LOG_CHARSET}</charset>
        </encoder>

        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>${LOG_LEVEL}</level>
        </filter>
    </appender>


    <!-- 定义处理日志控制器: 文件写入 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <!-- 过滤掉 INFO, TRACE 和 DEBUG 级别的日志, 屏蔽小于等于声明的等级的日志都会被屏蔽 -->
        <!-- 如果要显示 INFO 日志就需要设置 level = DEBUG -->
        <!-- 一般写入文件来说不需要 INFO 那些冗余信息, 有的第三方库会把某些关键信息写入在 INFO 所以还是屏蔽好点  -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>${LOG_LEVEL}</level>
        </filter>

        <!-- 默认日志文件名 -->
        <file>${LOG_DIR}/${LOG_NAME}.log</file>

        <!-- 日志压缩滚动配置, 用于当天变动的时候回滚压缩指定日志 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_DIR}/${LOG_NAME}.log.%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>

        <!--日志文件最大的大小, 超过打小就自动日志回滚压缩-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>100MB</MaxFileSize>
        </triggeringPolicy>

        <!-- 格式化处理 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [${LOG_NAME}] [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>${LOG_CHARSET}</charset>
        </encoder>
    </appender>

    <!-- 当然可以针对第三方包来单独处理 -->
    <!-- io.vertx为java中的包, 默认拦截DEBUG信息切换用 CONSOLE 处理 -->
    <!-- additivity = true, 如果上级也采用日志单元则会默认向上传递, 同时配置 appender-ref 则会被打印执行两次日志操作 -->
    <!-- 
    <logger name="io.vertx.core" level="DEBUG" additivity="false">
        <appender-ref ref="CONSOLE"/>
    </logger>
    -->

    <!-- 这里可以简要配置下,让底层去自行处理 -->
    <!-- 
    <logger name="io.vertx.core" level="${LOG_LEVEL}" additivity="true"/>
    -->

    <!-- 不过最好还是写入到具体我们的配置 -->
    <logger name="io.vertx.core" level="${LOG_LEVEL}" additivity="false">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </logger>

    <!-- 默认日志输出调用配置 -->
    <!-- 日志等级等级: ERROR、WARN、INFO、DEBUG、TRACE -->
    <!-- 日志级别排序为: TRACE < DEBUG < INFO < WARN < ERROR -->
    <root level="${LOG_LEVEL}">
        <!-- appender-ref 代表调用哪个 appender 处理  -->
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </root>

</configuration>

这里定义该有的日志等级配置, 如果想切换日志等级可以考虑直接环境变量切换即可.