你好陌生人,请不要试图越过权限文章,谢谢!

Python——关于pm2部署python服务logs乱码问题的解决

问题

问题情况

我使用基于nodejs的pm2部署python服务的时候,发现python服务器输出的日志在pm2的logs中显示的乱码,windows情况下,情况如下:

  发现我输出的中文内容全部是乱码,会导致我看不到日志内容

分析问题

  导致这个问题的原因是因为python输出的编码内容与命令行的不对应,编码可能为:GB2312,GBK等,存在无法识别的中文的可能性

  python3.*版本中,print不仅仅是一个打印,它还是一个函数、方法。

在python中,print语句实现打印,从技术角度来说,这是把一个或多个对象转换为其文本表达式形式,然后发送给标准输出流或者类似的文件流,更详细的说,打印与文件和流的概念紧密相连。

我们都知道在python中,向一个文件写东西是通过类似file.write(str)方法实现的,而你可能没想到print语句执行的操作其实也是一个写操作,不过他把我们从外设输入的数据写到了stdout流,并进行了一些特定的格式化。当然,和文件方法不通,在执行打印操作是,不需要将对象转换为字符串(print已经帮我们做好了)。《 https://blog.csdn.net/he_and/article/details/80675070

解决问题

  知道了问题所在,我可以重新sys.stdout的编码,强制为UTF-8的形式输出,python3版本中的filter类,我们可以重写这个类,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
import sys

class filter:
def __init__(self,target):
self.target=target

def write(self,s):
self.target.buffer.write(s.encode("utf-8"))

def flush(self):
self.target.flush()

sys.stdout=filter(sys.stdout);

  重写filter类,然后实例化它,并传入sys.stdout的输出流,则重写方法write以utf-8的方式重新写入buffer流,就能够让print所以的输出能够以utf-8的编码形式输出。

  后续,把这段代码封装成一个encodefix.py文件简单的引入所需要的模块中使用即可

引入后的日志

  引入后,日志显示正常

结尾

发现在windows老是遇到一些奇奇怪怪的问题,记录一下,踩过的坑不能老是跌倒,顺便了解一下print的实现原理,还是挺有意思的。这个方法也是实验室大哥教的我,实在强悍,嘿嘿,就这样。