logback-spring.xml 4.89 KB
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds" debug="false">
    <property name="LOG_NAME" value="cashier-service" />

    <property name="APP_BASE_DIR" value="${user.dir}" />

    <property name="LOG_HOME" value="${APP_BASE_DIR}/logs" />

    <property name="LOG_HISTORY_DIR" value="${LOG_HOME}/history" />

    <property name="LOG_CHARSET" value="UTF-8" />

    <property name="ASYNC_QUEUE_SIZE" value="1024" />

    <springProperty scope="context" name="profile" source="spring.profiles.active" defaultValue="dev" />

    <property name="LOG_PATTERN" value="%d %-5level [${LOG_NAME}-${profile}] [%t] [%c:%L] -| %msg%n" />

    <statusListener class="ch.qos.logback.core.status.NopStatusListener" />

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <target>System.out</target>
        <encoder>
            <charset>${LOG_CHARSET}</charset>
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
        <!-- 过滤器:只输出INFO及以上级别,减少控制台冗余 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}/${LOG_NAME}.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 日志命名:按天分类,按大小分卷,自动压缩为zip -->
            <fileNamePattern>${LOG_HISTORY_DIR}/${LOG_NAME}_%d{yyyy-MM-dd}_%i.log.zip</fileNamePattern>
            <!-- 日志保留30天,自动清理过期日志 -->
            <maxHistory>30</maxHistory>
            <!-- 单个日志文件最大60MB(减少切割次数) -->
            <maxFileSize>60MB</maxFileSize>
            <!-- 总日志大小上限10GB,防止磁盘占满 -->
            <totalSizeCap>10GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <charset>${LOG_CHARSET}</charset>
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
        <!-- 过滤器:只输出DEBUG及以上级别 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
    </appender>

    <appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="FILE" />
        <!-- 队列大小:根据业务并发调整 -->
        <queueSize>${ASYNC_QUEUE_SIZE}</queueSize>
        <!-- 超出队列时不阻塞业务线程(生产环境关键) -->
        <neverBlock>true</neverBlock>
        <!-- 丢弃策略:超出队列时丢弃TRACE/DEBUG级日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 包含调用者数据,避免异步日志丢失异常栈 -->
        <includeCallerData>true</includeCallerData>
    </appender>

    <!-- ************************ 多环境日志配置 ************************ -->
    <!-- 开发环境:仅控制台输出 -->
    <springProfile name="dev">
        <root level="INFO">
            <appender-ref ref="CONSOLE" />
        </root>

        <logger name="com.diligrp.cashier" level="DEBUG" additivity="false">
            <appender-ref ref="CONSOLE" />
        </logger>

        <logger name="com.alibaba" level="ERROR" additivity="false">
            <appender-ref ref="CONSOLE" />
        </logger>
    </springProfile>

    <!-- 测试环境:控制台+异步文件输出 -->
    <springProfile name="test">
        <root level="INFO">
            <appender-ref ref="CONSOLE" />
        </root>

        <logger name="com.diligrp.cashier" level="DEBUG" additivity="false">
            <appender-ref ref="ASYNC_FILE" />
        </logger>

        <logger name="com.alibaba" level="ERROR" additivity="false">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="ASYNC_FILE" />
        </logger>
    </springProfile>

    <!-- 灰度/生产环境:控制台+异步文件输出 -->
    <springProfile name="pre,prod">
        <root level="INFO">
            <appender-ref ref="CONSOLE" />
        </root>

        <logger name="com.diligrp.cashier" level="DEBUG" additivity="false">
            <appender-ref ref="ASYNC_FILE" />
        </logger>

        <logger name="com.alibaba" level="ERROR" additivity="false">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="ASYNC_FILE" />
        </logger>
    </springProfile>

    <!-- ************************ 通用框架日志配置 ************************ -->
    <logger name="org.springframework" level="WARN" additivity="false">
        <appender-ref ref="CONSOLE" />
    </logger>

    <logger name="org.mybatis" level="WARN" additivity="false">
        <appender-ref ref="CONSOLE" />
    </logger>
</configuration>