You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Spring Boot项目中Zalando Logbook的西里尔字符乱码问题

Logbook西里尔字符乱码修复方案

根因说明

你之前配置的Java编译编码是编译期规则,不影响运行时日志组件读取请求/响应体的编码逻辑。该问题是Logbook默认使用ISO-8859-1解析请求响应内容,和UTF-8字符集不兼容导致的乱码,按以下步骤修复即可:

  • 第一步:更新application.yml配置,新增Logbook强制编码规则和日志输出编码规则
logbook:
  format:
    style: http
  # 强制请求响应使用UTF-8编码解析
  servlet:
    force-request-encoding: UTF-8
    force-response-encoding: UTF-8
logging:
  # 全局指定日志输出编码为UTF-8
  charset:
    console: UTF-8
    file: UTF-8
  level:
    org:
      hibernate:
        SQL: DEBUG
      springframework:
        web: DEBUG
        security: INFO
      zalando:
        logbook: TRACE
  • 第二步:校验日志框架编码配置
    Spring Boot默认使用Logback作为日志实现,检查你项目中的logback-spring.xml配置,所有输出appender的encoder节点必须指定UTF-8编码:
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!-- 其他配置省略 -->
    <encoder>
        <charset>UTF-8</charset>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
    </encoder>
</appender>
  • 第三步:校验ELK采集链路编码
    如果你使用Filebeat/Logstash采集日志到Elasticsearch,需要确认采集端配置的字符编码为UTF-8:
    • Filebeat配置示例:
    filebeat.inputs:
    - type: log
      encoding: UTF-8
      paths:
        - /var/log/your-app/*.log
    
    • Logstash输入配置示例:
    input {
      file {
        path => "/var/log/your-app/*.log"
        codec => plain { charset => "UTF-8" }
      }
    }
    
  • 第四步(可选:以上配置无效时使用):自定义UTF-8格式的Logbook格式化器
    自定义实现Logbook的HttpLogFormatter接口,强制使用UTF-8读取请求响应体,将实现类注册为Spring Bean即可自动生效:
import org.zalando.logbook.*;
import java.nio.charset.StandardCharsets;

@Component
public class Utf8HttpLogFormatter implements HttpLogFormatter {

    @Override
    public String format(Correlation correlation, HttpRequest request) {
        // 可根据需要保留原有http格式的日志输出结构,仅替换body编码逻辑
        String body = new String(request.getBody(), StandardCharsets.UTF_8);
        return String.format("Request: %s %s, Body: %s", request.getMethod(), request.getPath(), body);
    }

    @Override
    public String format(Correlation correlation, HttpResponse response) {
        String body = new String(response.getBody(), StandardCharsets.UTF_8);
        return String.format("Response: %s, Body: %s", response.getStatus(), body);
    }
}

内容的提问来源于stack exchange,提问作者Khilarian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 15:06:07