Ubuntu Java日志乱码的定位与修复
一、快速判断与优先方案
java -Dfile.encoding=UTF-8 -jar your-app.jar。如使用nohup,同样加上该参数并重定向输出:nohup java -Dfile.encoding=UTF-8 -jar your-app.jar > output.log 2>&1 &。这会统一stdout/stderr与文件写入的编码预期,通常即可恢复中文显示。若你通过服务方式运行,也应在服务的启动脚本或 ExecStart 中追加该参数。二、按场景给出解决方案
log4j.appender.file.encoding=UTF-8;Logback 在对应的 appender 中使用 <encoder charset="UTF-8"/>。这样可避免框架按系统默认编码写入导致的乱码。new OutputStreamWriter(new FileOutputStream(...), StandardCharsets.UTF_8));export JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8(对大多数基于 Oracle/OpenJDK 的启动方式有效)。注意该变量是“工具选项”,会被所有 Java 进程继承,修改后需重启应用生效。三、验证与排查要点
locale,确保关键变量(如 LANG/LC_CTYPE)为 UTF-8;若不是,建议调整为 zh_CN.UTF-8 或 en_US.UTF-8 并重启会话/应用。System.getProperty("file.encoding") 或使用 JMX/启动日志确认 JVM 实际采用的编码。file -i your.log 查看 MIME 编码标注,或用 iconv -f <检测到的编码> -t UTF-8 your.log -o your.log.utf8 转码后再查看。java.security 来“全局硬改” file.encoding(如某些文章建议的添加 file.encoding=UTF-8)。这种做法侵入性强、可维护性差,且可能影响 JVM 其他行为,优先使用启动参数或日志框架配置。四、常见组合命令示例
java -Dfile.encoding=UTF-8 -jar your-app.jarnohup java -Dfile.encoding=UTF-8 -jar your-app.jar > app.log 2>&1 &/etc/profile 或 systemd 服务的 Environment 中设置 JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8,然后重启应用/会话。