Java项目中需配置日志框架PatternLayout占位符:Logback用%thread,Log4j2需includeLocation="true"并用%t,类名默认为Logger定义类而非调用类。

在 Java 项目中,要让日志输出包含线程名和类名,关键在于配置日志框架的格式化器(PatternLayout),主流框架如 Logback 和 Log4j2 都支持通过占位符直接插入 线程名 和 类名(通常是声明日志对象的类,非调用栈深层类)。
Logback(推荐,Spring Boot 默认)
修改 logback-spring.xml 或 logback.xml 中的 <pattern>:
-
%d{yyyy-MM-dd HH:mm:ss.SSS}:时间 -
[%thread]:当前线程名(如http-nio-8080-exec-1) -
[%logger{36}]:类名({36}表示最多保留包名后 36 个字符,避免过长;也可用%class,但%logger更常用且语义一致) -
[%level]:日志级别 -
%msg%n:日志消息 + 换行
完整示例:
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%logger{36}] [%level] %msg%n</pattern>
</encoder>
</appender>
效果输出类似:2024-05-20 10:30:45.123 [http-nio-8080-exec-2] [com.example.demo.UserController] [INFO] 用户登录成功
Log4j2(需显式启用类信息)
Log4j2 默认不记录类名(因性能考虑),需在 PatternLayout 中使用 %c 或 %C,并确保配置了 includeLocation="true"(否则类名为空):
立即学习“Java免费学习笔记(深入)”;
-
%t:线程名 -
%c{1}:简写类名(如UserController),%c输出全限定名 -
includeLocation="true"是关键,必须加在ConsoleAppender或RollingFileAppender上
配置片段示例(log4j2.xml):
<Appenders>
<Console name="Console" target="SYSTEM_OUT" includeLocation="true">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] [%c{1}] [%p] %m%n"/>
</Console>
</Appenders>
注意点与常见问题
-
类名不是调用位置:默认输出的是定义
Logger实例的类(如private static final Logger log = LoggerFactory.getLogger(UserService.class);),不是实际调用log.info()的方法所在类。若需精确调用类,Logback 可用%class+%method+%line,但会显著影响性能,慎用 -
线程名对异步场景友好:尤其在 Web 应用或使用线程池时,
[%thread]能清晰区分不同请求或任务的执行上下文 -
Spring Boot 用户:可直接在 application.properties 中快速配置(仅限简单格式):
logging.pattern.console=%d{HH:mm:ss.SSS} [%thread] [%logger{20}] [%level] %msg%n


















