一、问题场景说明
某日接到开发人员协查申请,某系统Tomcat测试环境日志中中文显示乱码,咨询测试服务器是否安装中文字符集,希望运维协助排查并解决乱码问题。系统环境说明:
- 操作系统:centos7.6
- tomcat版本:tomcat8.5
二、排查步骤
0、查看tomcat日志
#通过查看tomcat日志,确实是中文显示乱码
[wuhs@s146 8088_6088_jdk8_tomcat8_test.com_test]$ tail -fn 100 logs/catalina.out
1、查看操作系统是否支持中文
第一步是响应开发需求,检查操作系统字符集情况,经排查字符集虽然设置为en_US.UTF-8,操作系统本身是安装了中文字符集的。
[root@s146 scripts]# echo $LANG
en_US.UTF-8
[root@s146 scripts]# locale -a |grep CN
bo_CN
bo_CN.utf8
ug_CN
ug_CN.utf8
zh_CN
zh_CN.gb18030
zh_CN.gb2312
zh_CN.gbk
zh_CN.utf8
2、百度搜索tomcat中文日志乱码
通过百度搜索tomcat中文日志乱码,可能原因有三个地方conf/server.xml、conf/logging.properties和JDK的JAVA_OPTS参数设置。这三个地方开发人员也已经检查并设置了系统编码为UTF-8编码。
- conf/server.xml文件中URIEncoding编码参数设置,可以看到开发人员已经设置为了UTF-8,且经查询在tomcat8以后默认编码即为UTF-8,tomcat8之前默认编码是ISO-8859-1。
- conf/logging.properties中参数设置java.util.logging.ConsoleHandler.encoding = UTF-8
- JDK的JAVA_OPTS参数设置已添加-Dfile.encoding=UTF-8配置,此环境为tomcat多实例,(tomcat多实例部署见博文:Linux之tomcat多实例部署)
3、查看日志文件编码格式
通过file命令可以看到catalina.out文件格式编码在启动后发生了变化
[wuhs@s146 8088_6088_jdk8_tomcat8_test.com_test]$ file logs/catalina.out
logs/catalina.out: ASCII text, with very long lines
[wuhs@s146 8088_6088_jdk8_tomcat8_test.com_test]$ file logs/catalina.out
logs/catalina.out: ISO-8859 text, with very long lines
4、查看日志
编码格式ISO-8859是GBK的国际编码名称,过滤catalina.out日志发现日志格式被设置成了GBK,也就是说我们在tomcat多实例中设置的JAVA_OPTS关于文件编码参数未生效。
5、查看tomcat8原始环境下的编码设置
因为tomcat的-Dfile.encoding参数在真是bin环境下的为准。
[wuhs@s146 tomcat8]$ grep -rn GBK *
6、修改bin/catalina.sh文件
找到问题就好办了,修改bin/catalina.sh中的编码设置。其实tomcat8中默认配置如下图,可以恢复默认配置或者在指定配置中修改编码为UTF-8。
[wuhs@s146 tomcat8]$ vim +272 bin/catalina.sh
7、重启tomcat服务
重启tomcat服务后,再次查看日志,中文显示正常。
三、经验总结
因为tomcat多实例环境部署时间已久,且经历了多轮人员流转,也不清楚最初这个编码指定的原因。问题处理完成后,分析可能的原因是tomcat8软件最初是在windows环境下开发环境使用,windows环境设置为GBK中文,显示查看日志均是正常的,直接迁移到linux测试环境使用。通过此次问题处理,主要经验总结如下:
- 1、出现tomcat中文日志乱码,一般是如上三处编码参数设置问题;
- 2、乱码时可以查看日志文件编码格式,过滤编码关键字;
- 3、JVM虚拟机JAVA_OPTS参数中的编码设置起决定性作用。