Skip to content

Logback Pattern Layout 转换字符完整参考手册

一、基础转换字符

转换字符别名含义示例输出性能影响
%d{pattern}%date{pattern}日期时间2025-12-08 14:30:25.123
%m%msg, %message日志消息内容用户登录成功极低
%n-平台相关的换行符\n (Unix) 或 \r\n (Windows)极低
%p%le, %level日志级别INFO, DEBUG, ERROR极低
%r%relative从程序启动到日志创建的毫秒数12345
%t%thread线程名称main, http-nio-8080-exec-1

二、Logger 相关

转换字符别名含义示例输出说明
%c{length}%lo{length}, %logger{length}Logger 名称(可指定长度)com.Glowxq.UserServicelength 控制包名缩写
%C{length}%class{length}调用者的完全限定类名com.Glowxq.UserService⚠️ 性能开销大

Logger 名称长度示例

xml
<!-- 完整名称 -->
%logger → com.Glowxq.base.business.service.UserService

<!-- 只保留类名 -->
%logger{0} → UserService

<!-- 最多保留1段包名 -->
%logger{1} → c.i.b.b.s.UserService

<!-- 保留最后2段 -->
%logger{2} → service.UserService

<!-- 限制总长度为36字符 -->
%logger{36} → c.i.b.b.s.UserService

三、调用位置信息(谨慎使用)

转换字符别名含义示例输出性能影响
%C%class调用者类的完全限定名com.Glowxq.UserService⚠️ 极高
%F%file源文件名UserService.java⚠️ 极高
%L%line代码行号127⚠️ 极高
%M%method调用的方法名login⚠️ 极高
%caller{depth}-调用栈信息见下方示例⚠️ 极高

⚠️ 警告: 这些转换字符需要生成堆栈快照,对性能影响极大,生产环境慎用!

%caller 示例

xml
<pattern>%caller{2}</pattern>

输出:

Caller+0   at com.Glowxq.UserService.login(UserService.java:127)
Caller+1   at com.Glowxq.UserController.handleLogin(UserController.java:45)

四、MDC(映射诊断上下文)

转换字符含义示例配置示例输出说明
%X{key}输出指定 key 的 MDC 值%X{userId}user_12345常用于分布式追踪
%X{key:-defaultValue}带默认值的 MDC%X{traceId:-N/A}abc123N/Akey 不存在时显示默认值
%mdc{key}%X{key}%mdc{requestId}req_789别名写法

MDC 使用示例

java
import org.slf4j.MDC;

// 设置 MDC
MDC.put("userId", "user_12345");
MDC.put("traceId", "abc-def-123");
MDC.put("requestId", "req_789");

// 日志会自动带上 MDC 信息
logger.info("用户执行操作");

// 记得清理(避免内存泄漏)
MDC.clear();

配置:

xml
<pattern>%d [%X{traceId}] [%X{userId}] %m%n</pattern>

输出:

2025-12-08 14:30:25.123 [abc-def-123] [user_12345] 用户执行操作

五、异常堆栈

转换字符别名含义配置示例
%ex%exception, %throwable完整异常堆栈%ex
%ex{short}-第一行异常信息%ex{short}
%ex{full}-完整堆栈(默认)%ex{full}
%ex{n}-只显示前 n 行堆栈%ex{5}
%nopex%nopexception不输出异常信息%nopex
%rEx%rootException根异常(跳过包装异常)%rEx
%xEx%xException扩展异常信息(带 jar 信息)%xEx

异常堆栈示例

xml
<!-- 只显示前3行堆栈 -->
<pattern>%d %p %c - %m%n%ex{3}</pattern>

<!-- 显示完整堆栈,但过滤某些包 -->
<pattern>%d %p %c - %m%n%ex{full, 
    sun.reflect,
    java.lang.reflect,
    org.apache.catalina
}</pattern>

六、格式修饰符

6.1 宽度控制

格式含义示例输出(假设内容是 "INFO")
%20p最小宽度 20,右对齐%20p INFO
%-20p最小宽度 20,左对齐%-20pINFO
%.30p最大宽度 30,超出截断(从左边)%.30pINFO
%.-30p最大宽度 30,超出截断(从右边)%.-30pINFO
%20.30p最小 20,最大 30%20.30p根据实际长度调整

6.2 颜色高亮(仅控制台)

转换字符含义示例配置
%black()黑色%black(%m)
%red()红色%red(%p)
%green()绿色%green(%m)
%yellow()黄色%yellow(%p)
%blue()蓝色%blue(%logger)
%magenta()洋红色%magenta(%t)
%cyan()青色%cyan(%d)
%white()白色%white(%m)
%gray()灰色%gray(%logger)
%highlight()根据日志级别自动高亮%highlight(%p)

彩色日志示例

xml
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%cyan(%d{HH:mm:ss.SSS}) %highlight(%-5level) [%blue(%t)] %yellow(%logger{36}) - %msg%n</pattern>
    </encoder>
</appender>

效果:

  • 时间:青色
  • 级别:根据级别自动着色(ERROR 红色,WARN 黄色,INFO 绿色等)
  • 线程:蓝色
  • Logger:黄色

七、特殊转换字符

转换字符含义示例输出说明
%property{key}输出配置文件中的属性-读取 <property> 定义的值
%replace(p){regex, replacement}正则替换见下方用于脱敏等场景
%-5(...)给组合内容应用格式-可以给多个转换字符整体应用格式

%property 示例

xml
<configuration>
    <property name="APP_NAME" value="Glowxq-base"/>
    
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%property{APP_NAME}] %d %p - %m%n</pattern>
        </encoder>
    </appender>
</configuration>

输出:

[Glowxq-base] 2025-12-08 14:30:25.123 INFO - 用户登录成功

%replace 示例(日志脱敏)

xml
<!-- 手机号脱敏:将中间4位替换为 **** -->
<pattern>%replace(%m){'(\d{3})\d{4}(\d{4})', '$1****$2'}%n</pattern>

输入日志:

java
logger.info("用户手机号:13812345678");

输出:

用户手机号:138****5678

八、常用组合配置示例

8.1 简洁开发环境配置

xml
<configuration>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} %5p [%t] %logger{36} - %m%n</pattern>
        </encoder>
    </appender>
    
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
    </root>
</configuration>

8.2 彩色控制台(适合本地开发)

xml
<configuration>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%cyan(%d{HH:mm:ss.SSS}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1}.%M:%L) - %msg%n%ex{5}</pattern>
        </encoder>
    </appender>
    
    <root level="DEBUG">
        <appender-ref ref="CONSOLE"/>
    </root>
</configuration>

8.3 生产环境完整配置(带分布式追踪)

xml
<configuration>
    <property name="LOG_PATTERN" 
              value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{traceId:-N/A}] [%X{spanId:-N/A}] %5p [%t] %-40.40logger{39} : %m%n"/>
    
    <!-- 控制台输出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
    </appender>
    
    <!-- 文件输出(带滚动) -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/application.log</file>
        <encoder>
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/application.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>
    
    <!-- ERROR 单独文件 -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/error.log</file>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <encoder>
            <pattern>${LOG_PATTERN}%ex{full}</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/error.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>90</maxHistory>
        </rollingPolicy>
    </appender>
    
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
        <appender-ref ref="ERROR_FILE"/>
    </root>
</configuration>

8.4 JSON 格式日志(适合日志采集)

xml
<configuration>
    <appender name="JSON_CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <customFields>{"app":"Glowxq-base","env":"prod"}</customFields>
        </encoder>
    </appender>
    
    <root level="INFO">
        <appender-ref ref="JSON_CONSOLE"/>
    </root>
</configuration>

需要添加依赖:

xml
<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>7.4</version>
</dependency>

输出示例:

json
{
  "@timestamp": "2025-12-08T14:30:25.123+08:00",
  "message": "用户登录成功",
  "logger_name": "com.Glowxq.UserService",
  "thread_name": "http-nio-8080-exec-1",
  "level": "INFO",
  "app": "Glowxq-base",
  "env": "prod",
  "traceId": "abc123",
  "spanId": "span789"
}

九、性能优化建议

9.1 性能影响对比

转换字符性能影响建议
%m, %p, %t, %d极低✅ 放心使用
%c, %logger✅ 推荐使用
%X (MDC)低-中✅ 推荐用于追踪
%r✅ 可以使用
%C, %F, %L, %M极高⚠️ 仅调试环境
%caller极高⚠️ 仅调试环境

9.2 生产环境最佳实践

xml
<!-- ✅ 推荐:高性能配置 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{traceId}] %5p [%t] %logger{36} - %m%n</pattern>

<!-- ❌ 不推荐:性能杀手 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] %C.%M:%L - %m%n</pattern>

9.3 异步日志配置

xml
<configuration>
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>app.log</file>
        <encoder>
            <pattern>%d %p %c - %m%n</pattern>
        </encoder>
    </appender>
    
    <!-- 异步包装器 -->
    <appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="FILE"/>
        <queueSize>512</queueSize>
        <discardingThreshold>0</discardingThreshold>
    </appender>
    
    <root level="INFO">
        <appender-ref ref="ASYNC_FILE"/>
    </root>
</configuration>

十、调试技巧

10.1 查看实际使用的配置

在 Java 代码中:

java
import ch.qos.logback.classic.LoggerContext;
import org.slf4j.LoggerFactory;

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
StatusPrinter.print(lc);

10.2 配置文件调试

xml
<configuration debug="true">
    <!-- 会在启动时打印 Logback 的配置解析过程 -->
</configuration>

十一、常见问题

Q1: 日志中中文乱码?

xml
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
    <charset>UTF-8</charset>
    <layout class="ch.qos.logback.classic.PatternLayout">
        <pattern>%d %p %c - %m%n</pattern>
    </layout>
</encoder>

Q2: 如何在日志中输出 % 符号?

使用 %% 转义:

xml
<pattern>进度: %%d{HH:mm:ss} - %m%n</pattern>

Q3: MDC 在多线程环境下丢失?

使用 MDCTaskDecoratorTransmittableThreadLocal

java
@Bean
public TaskExecutor taskExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setTaskDecorator(new MDCTaskDecorator());
    return executor;
}

class MDCTaskDecorator implements TaskDecorator {
    @Override
    public Runnable decorate(Runnable runnable) {
        Map<String, String> contextMap = MDC.getCopyOfContextMap();
        return () -> {
            if (contextMap != null) {
                MDC.setContextMap(contextMap);
            }
            try {
                runnable.run();
            } finally {
                MDC.clear();
            }
        };
    }
}

参考资源


文档版本: 1.0
适用 Logback 版本: 1.2.x - 1.5.x
最后更新: 2025-12-08

基于 VitePress 构建