如何修复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
相关产品推荐
相关产品推荐

