Java规范日志输出需通过Logback或Log4j2的PatternLayout配置格式,如%d{yyyy-MM-dd HH:mm:ss.SSS}[%thread]%-5level%logger{36}-%msg%n,禁用System.out.println。

Java 中规范日志输出格式(含时间、线程等信息),关键在于配置日志框架的 PatternLayout(Log4j2 / Logback)或 Formatter(JUL),而非手写 System.out.println。统一使用 SLF4J 作为门面,底层选用 Logback(推荐)或 Log4j2,可灵活控制格式、级别和输出目标。
使用 Logback 配置带时间与线程信息的 pattern
Logback 是 Spring Boot 默认日志实现,通过 logback-spring.xml 或 logback.xml 配置:
- `%d{yyyy-MM-dd HH:mm:ss.SSS}` —— 精确到毫秒的本地时间
- `%thread` 或 `%t` —— 当前线程名(如 `http-nio-8080-exec-3`)
- `%-5level` —— 日志级别左对齐、占 5 字符(DEBUG/INFO/WARN/ERROR)
- `%logger{36}` —— 日志器名缩写(最多 36 字符,避免过长)
- `%msg%n` —— 日志内容 + 换行
示例配置片段:
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>输出效果:
2024-06-15 14:22:38.102 [main] INFO c.e.App - Application started
立即学习“Java免费学习笔记(深入)”;
Log4j2 的等效配置方式
若用 Log4j2(log4j2-spring.xml),使用 PatternLayout:
- `%d{yyyy-MM-dd HH:mm:ss.SSS}` —— 同 Logback
- `%t` 或 `%tn` —— 线程名
- `%p` —— 日志级别
- `%c{1.}` —— 简化类名(如 `App` 而非 `com.example.App`)
配置示例:
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %p %c{1.} - %m%n"/>
</Console>补充建议:提升可读性与排查效率
- 添加 traceId(如 Spring Cloud Sleuth 或自定义 MDC)便于链路追踪
- 生产环境建议用 JSON 格式(Logback + logstash-logback-encoder),方便 ELK 收集解析
- 避免在日志中拼接敏感信息(密码、token),可用占位符 + 参数化打印:
log.info("User {} logged in", username) - 禁止用字符串拼接代替参数化(如
"User " + user + " logged in"),否则低级别日志仍会执行拼接,影响性能
不推荐的手动方式(仅作对比)
不要这样写:
System.out.println(new Date() + " [" + Thread.currentThread().getName() + "] INFO " + msg);
原因:绕过日志框架,无法动态调级、无法重定向、无异步支持、无 MDC、不可配置、难以维护。


















