一、问题场景说明

  某日接到开发人员协查申请,某系统Tomcat测试环境日志中中文显示乱码,咨询测试服务器是否安装中文字符集,希望运维协助排查并解决乱码问题。系统环境说明:

  • 操作系统:centos7.6
  • tomcat版本:tomcat8.5

二、排查步骤

0、查看tomcat日志

java日志在Linux中文显示乱码 linux中文日志输出乱码_java日志在Linux中文显示乱码

#通过查看tomcat日志,确实是中文显示乱码
[wuhs@s146 8088_6088_jdk8_tomcat8_test.com_test]$ tail -fn 100 logs/catalina.out

1、查看操作系统是否支持中文

java日志在Linux中文显示乱码 linux中文日志输出乱码_参数设置_02


  第一步是响应开发需求,检查操作系统字符集情况,经排查字符集虽然设置为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。

java日志在Linux中文显示乱码 linux中文日志输出乱码_参数设置_03

  • conf/logging.properties中参数设置java.util.logging.ConsoleHandler.encoding = UTF-8
  • JDK的JAVA_OPTS参数设置已添加-Dfile.encoding=UTF-8配置,此环境为tomcat多实例,(tomcat多实例部署见博文:Linux之tomcat多实例部署)

3、查看日志文件编码格式

java日志在Linux中文显示乱码 linux中文日志输出乱码_tomcat_04

通过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关于文件编码参数未生效。

java日志在Linux中文显示乱码 linux中文日志输出乱码_java日志在Linux中文显示乱码_05

5、查看tomcat8原始环境下的编码设置

  因为tomcat的-Dfile.encoding参数在真是bin环境下的为准。

java日志在Linux中文显示乱码 linux中文日志输出乱码_参数设置_06

[wuhs@s146 tomcat8]$ grep -rn GBK *

6、修改bin/catalina.sh文件

  找到问题就好办了,修改bin/catalina.sh中的编码设置。其实tomcat8中默认配置如下图,可以恢复默认配置或者在指定配置中修改编码为UTF-8。

java日志在Linux中文显示乱码 linux中文日志输出乱码_tomcat_07

[wuhs@s146 tomcat8]$ vim +272 bin/catalina.sh

7、重启tomcat服务

  重启tomcat服务后,再次查看日志,中文显示正常。

java日志在Linux中文显示乱码 linux中文日志输出乱码_tomcat_08

三、经验总结

  因为tomcat多实例环境部署时间已久,且经历了多轮人员流转,也不清楚最初这个编码指定的原因。问题处理完成后,分析可能的原因是tomcat8软件最初是在windows环境下开发环境使用,windows环境设置为GBK中文,显示查看日志均是正常的,直接迁移到linux测试环境使用。通过此次问题处理,主要经验总结如下:

  • 1、出现tomcat中文日志乱码,一般是如上三处编码参数设置问题;
  • 2、乱码时可以查看日志文件编码格式,过滤编码关键字;
  • 3、JVM虚拟机JAVA_OPTS参数中的编码设置起决定性作用。