2025.6.22

以下是根据企业级最佳实践和性能优化建议完善的Logback配置文件,结合了异步日志分级存储滚动策略敏感信息过滤等功能:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 seconds" debug="false">
    <!-- 基础属性定义 -->
    <property name="log.path" value="logs"/>
    <property name="maxHistory" value="30"/>
    <property name="totalSizeCap" value="5GB"/>
    <property name="maxFileSize" value="30MB"/>
    <property name="app.name" value="your-application"/> <!-- 应用名称需修改 -->
    
    <!-- 日志格式定义 -->
    <property name="console.pattern" 
              value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{traceId}] [%thread] %highlight(%-5level) %logger{36} - %msg%n"/>
    <property name="file.pattern" 
              value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{traceId}] [%thread] %-5level %logger{36} - %msg%n"/>

    <!-- 控制台输出(同步) -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${console.pattern}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 生产环境建议限制控制台日志级别 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
    </appender>

    <!-- 异步控制台输出(提升性能) -->
    <appender name="ASYNC_CONSOLE" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>512</queueSize>
        <appender-ref ref="CONSOLE"/>
    </appender>

    <!-- 全量日志文件(异步+滚动) -->
    <appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/${app.name}.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/${app.name}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>${maxFileSize}</maxFileSize>
            <maxHistory>${maxHistory}</maxHistory>
            <totalSizeCap>${totalSizeCap}</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>${file.pattern}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 禁用即时刷新提升性能 -->
        <immediateFlush>false</immediateFlush>
    </appender>

    <!-- 错误日志单独存储 -->
    <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/${app.name}-error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/${app.name}-error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>${maxFileSize}</maxFileSize>
            <maxHistory>${maxHistory}</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${file.pattern}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
    </appender>

    <!-- SQL日志单独配置(MyBatis/MyBatis-Plus适用) -->
    <appender name="SQL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/sql.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/sql.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>${maxFileSize}</maxFileSize>
            <maxHistory>7</maxHistory> <!-- SQL日志保留7天 -->
        </rollingPolicy>
        <encoder>
            <pattern>${file.pattern}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 异步日志处理器 -->
    <appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>1024</queueSize>
        <appender-ref ref="FILE_ALL"/>
    </appender>
    <appender name="ASYNC_ERROR" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>512</queueSize>
        <appender-ref ref="FILE_ERROR"/>
    </appender>

    <!-- 日志级别控制 -->
    <logger name="org.springframework" level="WARN"/>
    <logger name="com.zaxxer.hikari" level="WARN"/>
    <logger name="org.mybatis" level="DEBUG" additivity="false">
        <appender-ref ref="SQL_FILE"/>
    </logger>
    
    <!-- 生产环境建议设置为INFO级别 -->
    <root level="INFO">
        <appender-ref ref="ASYNC_CONSOLE"/>
        <appender-ref ref="ASYNC_FILE"/>
        <appender-ref ref="ASYNC_ERROR"/>
    </root>

    <!-- 开发环境特殊配置(通过springProfile激活) -->
    <springProfile name="dev">
        <logger name="com.yourpackage" level="DEBUG"/>
        <root level="DEBUG">
            <appender-ref ref="CONSOLE"/>
        </root>
    </springProfile>
</configuration>

主要优化点说明:

  1. 异步日志处理:通过AsyncAppender提升吞吐量,避免I/O阻塞主线程
  2. 分级存储:分离全量日志和错误日志,便于问题排查
  3. 性能优化
    • 禁用immediateFlush减少I/O操作
    • 避免在pattern中使用文件名行号等耗性能的参数
  4. SQL日志隔离:单独配置MyBatis日志,便于数据库调试
  5. 环境区分:通过springProfile实现开发/生产环境的不同配置
  6. 滚动策略:同时限制单个文件大小和总日志量,避免磁盘爆满
  7. 敏感信息:通过%X{traceId}实现请求链路追踪

建议根据实际需求调整:

  • 修改app.name为实际应用名称
  • 调整各日志级别的保留天数
  • 生产环境建议关闭DEBUG级别日志
posted @ 2025-06-22 22:49  258333  阅读(21)  评论(0)    收藏  举报