编程知识 cdmana.com

Tomcat 控制台 乱码 淇℃伅

乱码输出

正常的输出:

...
19-Sep-2020 19:14:30.875 信息 [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
19-Sep-2020 19:14:30.890 信息 [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"]
19-Sep-2020 19:14:30.896 信息 [main] org.apache.catalina.startup.Catalina.start Server startup in 1176 ms

乱码的输出:

...
19-Sep-2020 19:15:38.624 淇℃伅 [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
19-Sep-2020 19:15:38.640 淇℃伅 [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"]
19-Sep-2020 19:15:38.645 淇℃伅 [main] org.apache.catalina.startup.Catalina.start Server startup in 1243 ms

如图:
在这里插入图片描述

原因

Windows系统控制台的编码(默认为GBK)
Tomcat的控制台日志配置的编码方案与之不匹配。

没有哪里配置错了,只是不一致,无法匹配而已。

打个比方:咱两约定了加密通信,然后你想告诉我“我爱和平”,查字典A,这四个字对应的编号为:12 21 23 34,然后把12 21 23 34发给了我。

我本来应该在字典A中查这些编号对应的文字,可是我没有(因为你并没有告诉我你使用的是字典A中的映射规则)。
我在字典B中查询这4个编号对应的信息,拼起来是:“天山雪莲”,或者是“里香很蓝”,
总之,我因为采用了错误的翻译规则,得到了错误的信息,可能与你原本要表达的信息截然相反,也可能风马牛不相及。

已知:
Windows系统中cmd使用的编码默认为GBK,而Tomcat的控制台日志的配置可不一定是GBK

调试 && 解决

解决方案两种,但就一个方向:使得系统内部的参与者使用统一的通信转换规则(互相知道彼此的编码方案是什么)。

  • Windows cmd 编码修改方式

Windows cmd 默认编码为GBK
设置cmd的编码为GBK: chcp 936
设置cmd的编码为UTF-8: chcp 65001
查看cmd的编码: chcpmode
chcp表示:Change Code Page,改变代码页(使用的编码方案)。

在这里插入图片描述

在这里插入图片描述

  • Tomcat 控制台日志 编码配置方式

编辑CATALINA_HOME/conf/logging.properties中关于java.util.logging.ConsoleHandler的配置项。

java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter
java.util.logging.ConsoleHandler.encoding = UTF-8
  • 解决方式
    1. cmd中chcp 65001然后启动tomcat:catalina run。这是统一编码为UTF-8
    2. cmd不变,修改tomcat的控制台日志配置:
      java.util.logging.ConsoleHandler.encoding = GBK,这是程序配置迁就系统的控制台环境。

有人乱码,有人不乱码

可能性太多了,比如:二者使用了不同的tomcat版本,而这两个版本正好有个相关配置不同。

Tomcat中,负责输出日志到控制台的类为:java.util.logging.ConsoleHandler
在不同版本中配置文件中相关的配置项不一致
配置项为:CATALINA_HOME/conf/logging.properties

  • 9.0.12 未乱码
handlers = 1catalina.org.apache.juli.AsyncFileHandler, 2localhost.org.apache.juli.AsyncFileHandler, 3manager.org.apache.juli.AsyncFileHandler, 4host-manager.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler

.handlers = 1catalina.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler

java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter

  • 9.0.22 乱码
handlers = 1catalina.org.apache.juli.AsyncFileHandler, 2localhost.org.apache.juli.AsyncFileHandler, 3manager.org.apache.juli.AsyncFileHandler, 4host-manager.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler

.handlers = 1catalina.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler

java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter
java.util.logging.ConsoleHandler.encoding = UTF-8

可以看到9.0.229.0.12多了一行配置:java.util.logging.ConsoleHandler.encoding = UTF-8

其他版本未测。
如果有兴趣可以在这里找到tomcat所有版本的下载链接,完成自测。

其他

以上只是考虑了以下两者:

  • Windows系统的cmd窗口使用的编码方式;
  • Tomcat中控制台日志的关于编码的配置

如果你是在IDE中(如eclipseIDEA)中出现了相同的问题。
那可以现在控制台中启动测试。确定无误后引入IDE操作,并调试IDE中关于encoding的配置。

版权声明
本文为[锦天]所创,转载请带上原文链接,感谢
https://wuyujin.blog.csdn.net/article/details/108684999

Scroll to Top