supervisord日志中文字符乱码的解决方案
上一篇[CentOS安装Supervisord]我们讲到了supervisord的安装及运行相关的内容,并配置了可以通过webui界面来查看应用程序运行情况及输出的日志信息。
但当输出日志中存在中文的时候很容易发现中文字符是乱码的,无法正常查看。
一、分析原因
初步分析存在中文乱码可能是因为日志读取时所用编码不支持中文字符。我们需要先确定一下日志文件中的字符是否是正常显示的。
cat /var/log/test.keeplive.out.log
可以看到日志文件中的中文字符是可以正常显示的,那么乱码的主要问题可能就是在webui中输出时的编码转换上了。
因为supervisord配置文件中并没有指明webui所存放的路径及实现的方式,我们需要通过其他方式来定位出错的具体位置。
二、定位问题出错的具体位置
当我们在webui发现乱码的时候,地址栏中访问的路径为http://192.168.1.123:56613/tail.html?processname=test.keeplive
,我们先从tail.html文件来查找定位。
打开supervisord的github仓库,在搜索栏中搜索tail.html
,得到如下结果:
看来自带的webui是通过python实现的,那么需要在web.py文件中找到相应的输出代码,在web.py中搜索tail,在224行我们可以看到
这句tailbody.content(tail)
应该就是执行输出的语句了。
三、修复乱码
由于对python并不了解,所以这时候需要借助搜索引擎来搜索一下python输出时如何设置编码。
参考链接:Python 多种中文乱码问题原因及解决方法(decode()、encode()、raw_input())-CJavaPy
接下来我们在centos中通过find | -name web.py
查找文件,定位到本机中的文件位置为:/usr/lib/python2.7/site-packages/supervisor/web.py
打开web.py中,将214修改为如下代码(本机web.py文件中此行位置在214行):
tailbody.content(tail.decode('utf-8'))
保存文件,并重启supervisord systemctl restart supervisord.service
(关键)。
四、验证修复
重启supervisord后在webui界面刷新tail,可以看到日志中的中文字符已经可以正常的显示了。
五、其它
后面详细了解python的decode方法,发现其实还有另外一种重载方式:tail.decode(encoding="utf8",errors="ignore")
,这样写应该更安全一些,避免转换编码时报错页面无法正常显示。