Windows 机器上的服务写出的日志,在 Linux 上用 less 打开,中文全是问号,英文和数字正常,grep 中文关键词一条都搜不到。日志里能对上时间点,这种反而好排。

JVM 的 file.encoding 跟随系统是 GBK,日志按 GBK 写盘。查看和采集端都按 UTF-8 解码,非法字节被替换成问号。这一点先确认清楚,后面就不用反复试。

java -Dfile.encoding=UTF-8 -jar app.jar
iconv -f GBK -t UTF-8 app.log -o app.utf8.log

这次卡住的地方就在「日志编码不一致」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。

改完顺手把文档补一句,省得下次自己重新推一遍。监控和日志的时间要对上,时区不一致会多绕很大一圈。

临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

处理上按这个顺序:启动参数显式指定文件编码为 UTF-8;日志 appender 的 encoder 也设成 UTF-8;采集端声明 charset 保持一致;历史文件用 iconv 转码后再入库。

结果对不对很好判断,新日志中文正常显示 grep 中文关键词能命中。

作者 9823189