Tomcat控制台日志乱码需三步解决:先确保JAVA_HOME正确配置且路径无中文空格;再修改catalina.bat添加-Dfile.encoding=UTF-8等参数;最后根据CMD编码模式设置logging.properties中ConsoleHandler.encoding为GBK或UTF-8。

Tomcat启动后控制台日志全是“???”或方块符号,根本看不出错误堆栈和请求路径,调试完全卡死——这通常不是代码问题,而是环境变量配置与编码链路断裂的直接表现。
确认乱码是否由JAVA_HOME未生效引发
打开命令行,执行 java -version,若提示“不是内部或外部命令”,说明系统根本没识别到Java;此时无论后续怎么改Tomcat配置都无效,必须先修复JAVA_HOME。
右键“此电脑”→“属性”→“高级系统设置”→“环境变量”,在【系统变量】中检查是否存在JAVA_HOME变量,值必须是JDK根目录(如C:\Program Files\Java\jdk-17.0.2),不能是jre目录,也不能带\bin后缀。
【关键前提】 JAVA_HOME路径中不能含中文、空格或特殊字符;若安装在C:\Program Files\下,建议重装到C:\jdk17这类纯英文无空格路径,否则catalina.bat读取时会截断。
强制JVM使用UTF-8编码启动Tomcat
进入Tomcat安装目录下的bin文件夹,用记事本或VS Code打开catalina.bat。
找到第216行附近以set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%"开头的语句,在该行末尾追加:-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8
修改后整行变为:set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS% -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8"
这一步绕过Windows CMD默认GBK编码,让JVM从启动起就以UTF-8解析所有字符串和资源文件,是解决乱码最底层有效的手段。
同步修正Tomcat日志处理器编码
方法一:直接改conf/logging.properties
打开该文件,定位到第47行左右:java.util.logging.ConsoleHandler.encoding = UTF-8
将其改为:java.util.logging.ConsoleHandler.encoding = GBK
注意:这里反直觉地设为GBK,是因为Windows控制台(CMD/PowerShell)原生不支持UTF-8输出流,强行设UTF-8会导致控制台彻底无法渲染——改成GBK才能让中文正确显示在黑窗口里。
方法二:若你已将CMD切换为UTF-8模式(通过chcp 65001),则此处必须保持UTF-8,否则日志仍会乱码。
验证并固化编码链路
第一步:在IDEA中新建一个Servlet,加入以下代码并部署运行:
System.out.println("file.encoding: " + System.getProperty("file.encoding"));System.out.println("sun.jnu.encoding: " + System.getProperty("sun.jnu.encoding"));
第二步:观察控制台输出。如果两行都显示UTF-8,说明JVM层编码已生效;若仍为GBK或MS932等,则返回
强制JVM使用UTF-8编码启动Tomcat
重新检查catalina.bat修改位置和引号闭合。
第三步:确认IDEA自身编码设置:File → Settings → Editor → File Encodings → 全部设为UTF-8,并勾选Transparent native-to-ascii conversion。
第四步:重启Tomcat,此时控制台日志应清晰可读,无任何“”或“???”。

















