Java日志输出规范要求每行一个合法JSON对象,推荐Logback+logstash-logback-encoder或Log4j2+JacksonJsonLayout实现结构化输出,需统一字段命名、包含基础字段、完整展开异常并脱敏敏感信息。

Java 日志输出规范的 JSON 格式,核心是让每条日志是一行合法、结构清晰、字段语义明确的 JSON 对象,便于日志采集(如 Filebeat、Fluentd)、解析(如 Elasticsearch ingest pipeline)和分析(如 Kibana)。不推荐手动拼接字符串,而应使用支持结构化日志的框架和 Layout/Encoder。
用 Logback + logstash-logback-encoder(推荐)
Logback 是最常用的日志框架,logstash-logback-encoder 提供了开箱即用的 JSON 输出能力,支持上下文、MDC、异常堆栈、自定义字段等。
- 添加 Maven 依赖:
<dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>7.4</version> <!-- 适配你的 Logback 版本 --> </dependency>
- 在
logback-spring.xml中配置 JSON encoder:
<appender name="JSON_CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp/>
<context/>
<version/>
<pattern>
<pattern>{"level":"%level","logger":"%logger","message":"%message","traceId":"%X{traceId:-}","spanId":"%X{spanId:-}","thread":"%thread"}</pattern>
</pattern>
<stackTrace/>
<throwable/>
<arguments/>
<mdc/>
</providers>
</encoder>
</appender>✅ 优点:自动转义双引号、处理换行、序列化异常、支持 MDC(如链路追踪 ID)、可扩展字段;❌ 注意避免在 pattern 中重复定义已由其他 provider 输出的字段(如 timestamp 已存在,就别再写 "time":"%d")。
用 Log4j2 + JacksonJsonLayout
Log4j2 2.15+ 内置 JacksonJsonLayout,无需额外依赖(但需确保 classpath 有 Jackson),适合已用 Log4j2 的项目。
立即学习“Java免费学习笔记(深入)”;
- 配置示例(
log4j2-spring.xml):
<Console name="JsonConsole" target="SYSTEM_OUT">
<JacksonJsonLayout compact="true" eventEol="true">
<KeyValuePair key="service" value="my-app"/>
<KeyValuePair key="env" value="${sys:SPRING_PROFILES_ACTIVE:-dev}"/>
</JacksonJsonLayout>
<PatternLayout pattern="%m%n"/>
</Console>⚠️ 注意:compact="true" 确保单行输出;eventEol="true" 在每条 JSON 后加换行符(符合日志行协议);KeyValuePair 可注入静态或系统属性字段。MDC 和上下文变量会自动包含,异常也会被完整序列化。
关键规范要点(无论用哪种方案)
- 每行一个 JSON 对象:禁止换行缩进、禁止多对象包在一个数组里,否则日志收集器无法按行切分
-
字段命名统一小写+下划线(如
trace_id、error_message),兼容大多数日志平台字段映射习惯 -
必含基础字段:
timestamp(ISO8601 格式,带时区)、level(大写如 "ERROR")、logger(全限定类名)、message(原始日志文本)、thread -
异常要完整展开:不要只打
e.toString(),让 encoder 自动处理throwableprovider,保留 stack trace 数组 -
敏感信息脱敏:避免直接打印密码、token、身份证号等;可通过自定义
Provider或 MDC 预处理过滤
补充:简单场景可用 Slf4j + 自定义工具类(不推荐生产)
仅用于调试或极简服务,例如:
public static String toJsonLog(Level level, String logger, String msg, Throwable t) {
Map<String, Object> log = new HashMap<>();
log.put("timestamp", Instant.now().toString());
log.put("level", level.toString());
log.put("logger", logger);
log.put("message", msg);
if (t != null) log.put("exception", t.toString());
return new ObjectMapper().writeValueAsString(log);
}⚠️ 缺陷明显:不支持 MDC、无异步缓冲、异常堆栈不结构化、性能差、易出错。仅作理解原理参考,勿用于线上。


















