Tomcat日志中文乱码的定位与解决
一、常见成因
二、快速排查路径
file -i catalina.out,应看到 charset=utf-8;若为 iso-8859-1 或 gbk,说明写入编码不对。jinfo <tomcat_pid> | grep file.encoding,应为 UTF-8。echo $LANG,建议为 en_US.UTF-8 或 zh_CN.UTF-8。chcp,应为 65001(UTF-8);SecureCRT/Xshell 会话编码设为 UTF-8。System.out.println("中文") 或简单 logger 输出中文,排除业务代码干扰。三、解决方案与配置示例
export JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8"set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=UTF-8java.util.logging.ConsoleHandler.encoding = UTF-8java.util.logging.FileHandler.encoding = UTF-8charset="UTF-8"。<charset>UTF-8</charset>。URIEncoding="UTF-8";Spring 项目可配置 CharacterEncodingFilter 统一请求/响应编码。四、不同场景的推荐配置
| 场景 | 关键配置 | 备注 |
|---|---|---|
| 仅控制台输出乱码 | JUL:ConsoleHandler.encoding=UTF-8;Logback/Log4j2:ConsoleAppender 设置 charset=UTF-8;终端:chcp 65001(Windows)、SecureCRT/Xshell 设为 UTF-8 |
文件可能正常,终端显示导致 |
| 仅日志文件乱码 | JUL:FileHandler.encoding=UTF-8;Logback/Log4j2:FileAppender 设置 charset=UTF-8 |
先确认磁盘文件真实编码 |
| 启动日志 catalina.out 乱码 | 启动参数 -Dfile.encoding=UTF-8 + JUL 文件/控制台编码为 UTF-8 |
避免被重定向管道或脚本改编码 |
| 应用日志与访问日志均乱码 | 应用日志框架统一 UTF-8 + URIEncoding="UTF-8" + 请求过滤器 |
防止参数解码错误写入日志 |
| Linux 环境整体乱码 | LANG=zh_CN.UTF-8 或 en_US.UTF-8 |
保证系统与 JVM 一致 |
五、注意事项与常见坑
JAVA_OPTS 与 CATALINA_OPTS 混用)。System.setProperty("file.encoding", "UTF-8") 在运行时“补救”,应在启动前通过 -Dfile.encoding=UTF-8 固定。new String(str.getBytes("UTF-8"), "UTF-8") 这类无意义转换。