Logback-spring.xml 配置详解

配置文件结构
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 属性定义 -->
    <property name="LOG_HOME" value="/logs"/>
    <springProperty name="APP_NAME" source="spring.application.name"/>
    
    <!-- 日志输出格式 -->
    <property name="CONSOLE_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
    
    <!-- Appender定义 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 控制台输出配置 -->
    </appender>
    
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 文件输出配置 -->
    </appender>
    
    <!-- Logger定义 -->
    <logger name="com.example" level="DEBUG"/>
    
    <!-- Root Logger -->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </root>
</configuration>
属性配置参数
<!-- 普通属性 -->
<property name="LOG_PATH" value="/var/log/myapp"/>
<property name="MAX_HISTORY" value="30"/>
<property name="MAX_FILE_SIZE" value="100MB"/>
<property name="TOTAL_SIZE_CAP" value="3GB"/>

<!-- Spring属性 -->
<springProperty name="LOG_LEVEL" source="logging.level.root" defaultValue="INFO"/>
<springProperty name="PROFILE" source="spring.profiles.active" defaultValue="dev"/>

<!-- 系统属性 -->
<property name="USER_HOME" value="${user.home}"/>
<property name="TEMP" value="${java.io.tmpdir}"/>

<!-- 条件属性 -->
<if condition='property("spring.profiles.active").contains("prod")'>
    <then>
        <property name="LOG_PATH" value="/opt/logs"/>
    </then>
    <else>
        <property name="LOG_PATH" value="./logs"/>
    </else>
</if>
日志输出格式参数
<!-- 完整格式示例 -->
<property name="PATTERN" 
          value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} [%file:%line] - %msg%n"/>

<!-- 格式符号详解 -->
%d{pattern}          # 日期时间
%thread              # 线程名
%-5level             # 日志级别
%logger{length}      # Logger名称
%msg                 # 日志消息
%n                   # 换行符
%M                   # 方法名
%L                   # 行号
%F                   # 文件名
%c{length}           # Logger名称(缩写)
%C{length}           # 类名(全限定名)
%X{key}              # MDC中的值
%ex                  # 异常堆栈
%highlight()         # 高亮显示
%cyan()              # 颜色输出
Appender配置参数
<!-- ConsoleAppender -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder charset="UTF-8">
        <pattern>${CONSOLE_PATTERN}</pattern>
    </encoder>
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>DEBUG</level>
    </filter>
    <layout class="ch.qos.logback.classic.PatternLayout">
        <pattern>${PATTERN}</pattern>
    </layout>
    <target>System.out</target>
    <immediateFlush>true</immediateFlush>
</appender>

<!-- RollingFileAppender -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOG_PATH}/app.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <fileNamePattern>${LOG_PATH}/app.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
        <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
        <maxHistory>${MAX_HISTORY}</maxHistory>
        <totalSizeCap>${TOTAL_SIZE_CAP}</totalSizeCap>
    </rollingPolicy>
    <encoder>
        <pattern>${FILE_PATTERN}</pattern>
    </encoder>
</appender>
Filter过滤器参数
<!-- LevelFilter -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
    <level>ERROR</level>
    <onMatch>ACCEPT</onMatch>
    <onMismatch>DENY</onMismatch>
</filter>

<!-- ThresholdFilter -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    <level>WARN</level>
</filter>

<!-- EvaluatorFilter -->
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
    <evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
        <marker>NOTIFY_ADMIN</marker>
    </evaluator>
    <onMatch>ACCEPT</onMatch>
    <onMismatch>NEUTRAL</onMismatch>
</filter>
Logger配置参数
<!-- Root Logger -->
<root level="${LOG_LEVEL:-INFO}">
    <appender-ref ref="CONSOLE"/>
    <appender-ref ref="FILE"/>
    <additivity>false</additivity>
</root>

<!-- 特定包/类Logger -->
<logger name="com.example.controller" level="DEBUG" additivity="false">
    <appender-ref ref="CONTROLLER_FILE"/>
</logger>

<!-- 第三方框架Logger -->
<logger name="org.springframework" level="WARN"/>
<logger name="org.hibernate" level="ERROR"/>
<logger name="com.alibaba.druid" level="WARN"/>
<logger name="org.apache.kafka" level="INFO"/>
优化建议
  • 使用springProperty替代property以支持Spring环境变量
  • 为不同环境(dev/test/prod)配置不同的日志级别和输出路径
  • 使用SizeAndTimeBasedRollingPolicy实现日志文件按时间和大小滚动
  • 为关键业务包配置单独的Logger和Appender
  • 在生产环境禁用DEBUG日志以提高性能
  • 使用MDC(Mapped Diagnostic Context)添加请求ID等跟踪信息
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐