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>
主要优化点说明:
- 异步日志处理:通过AsyncAppender提升吞吐量,避免I/O阻塞主线程
- 分级存储:分离全量日志和错误日志,便于问题排查
- 性能优化:
- 禁用
immediateFlush
减少I/O操作 - 避免在pattern中使用文件名行号等耗性能的参数
- 禁用
- SQL日志隔离:单独配置MyBatis日志,便于数据库调试
- 环境区分:通过
springProfile
实现开发/生产环境的不同配置 - 滚动策略:同时限制单个文件大小和总日志量,避免磁盘爆满
- 敏感信息:通过
%X{traceId}
实现请求链路追踪
建议根据实际需求调整:
- 修改
app.name
为实际应用名称 - 调整各日志级别的保留天数
- 生产环境建议关闭DEBUG级别日志