应将json对象格式化为带缩进的字符串再输出,推荐用jackson的objectmapper启用indent_output并处理中文编码,结合脱敏、截断和工具类封装,或使用logback的jsonlayout实现结构化日志。

在 Java 项目中直接用 logger.info(obj) 输出 JSON 对象,通常只显示类名和哈希码,可读性差。要让日志中清晰、美观地展示 JSON 数据,关键在于**把对象转成格式化(带缩进、换行)的 JSON 字符串再输出**,而不是依赖默认 toString()。
用 Jackson 的 ObjectMapper 格式化输出
Spring 项目通常已引入 Jackson,可复用 ObjectMapper 实例(建议注入或静态复用,避免频繁创建):
- 启用缩进:调用
enable(SerializationFeature.INDENT_OUTPUT) - 处理中文不乱码:设置
configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, true)或使用 UTF-8 编码写入字符串 - 示例代码:
String jsonStr = mapper.writeValueAsString(data);
log.info("请求参数: {}", jsonStr);
避免日志内容过长影响排查
完整 JSON 可能很长,尤其含 base64 或大数组时。实际使用中建议:
- 对敏感字段(如 password、token)做脱敏后再序列化
- 限制日志长度:用
StringUtils.substring(jsonStr, 0, 2000)截断,末尾加 "..." 提示被截 - 生产环境慎打全量 JSON,可用结构化日志(如 Logback 的 JSONLayout)替代手动拼接
统一封装成工具方法更安全
避免每个地方重复配置 ObjectMapper,推荐封装一个线程安全的工具类:
- 使用 static final ObjectMapper,并禁用默认的日期序列化(防止报错)
- 提供
toJsonPretty(Object obj)方法,内部捕获 JsonProcessingException 并返回错误提示 - 支持空值/循环引用保护(如配置
disable(SerializationFeature.FAIL_ON_EMPTY_BEANS))
Logback 配合 JSONLayout 实现结构化日志
如果目标是让整条日志本身就是标准 JSON(方便 ELK 收集),可配置 Logback 的 JsonLayout:
- 在
logback-spring.xml中定义 JSON layout,自动将 MDC、时间、level、message 转为 JSON 字段 - 业务代码中仍传普通字符串,但 message 字段可包含已格式化的 JSON 片段
- 注意:此时不要在 message 里再套一层 JSON,否则会变成字符串转义,失去可解析性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











