首页 > Python基础教程 >
-
【踩坑记录】记录一次使用Python logging库多进程打印日志的填坑过程
- 项目使用Python自带的logging库来打印日志
- 项目部署在一台Centos7的机器上
-
项目采用
gunicorn
多进程部署
|过程:
1、LOG日志代码封装:
采用logging库,并设置when='MIDNIGHT',以天为单位,进行日志分割,前一天的日志会自动加上前一天的日期,最新日志始终会打印到mock-service.log文件中,以下为log打印的封装
2、调用LOG封装
实际调用时,采用导包并设置别名的方式进行log打印,以下为实际打印log的demo
3、项目部署环境
该项目目前部署在centos7的一台服务器上面,不过我觉得这个应该和部署在哪里没关系
4、出现的问题(坑,大坑)
项目持续在服务器上面运行着,但有时候会发现,日志根本没有打印到mock-service.log
文件中,比如下面这个,12月29的调用日志,打到了27号的log文件中了
|解决思路:
1、第一次尝试:
为了找到原因,之前有些调用log打印是写在init方法里面,然后下面的方法用self.log进行调用,后面为了解决这个问题,把所有init里面的初始化都去掉了,现在我觉得问题可能还是出在调用上,日志封装应该没有问题。现在这个项目有些是类方法在打印日志,有些是封装的函数在打印日志。整个项目是用flask框架写的,然后启动run.py文件,我觉得可能是出现在了某一个地方的调用一直占用了日志打印的进程,导致后面再调用日志打印的时候打印到了之前的文件中,只是一个猜测,也不知道怎么去验证这个问题
2、第二次尝试
经过再一次的百度、谷歌查找,发现Python的这个自带的logging库是不支持多进程
的,后面查到可通过如下方式进行解决这个问题
关于logging库
不支持多进程
的文章: https://juejin.im/post/5bc2bd3a5188255c94465d31 https://zhuanlan.zhihu.com/p/29557920
- 自行对logging库重写,以解决该问题
- 通过别人已封装好的第三方库
我选择第二种方式,不重复造轮子,经过一番对比,最终选择了这个第三方库concurrent_log
,详细的可去github仓库查看,并且作者对重写后的代码进行了测试,证明已解决多线程、多进程的问题
安装方式:
github地址:
https://github.com/huanghyw/concurrent_log
关于自己对logging库重写也是可以的,下面介绍几篇重写的文章
- https://www.cnblogs.com/restran/p/4743840.html
- https://www.jianshu.com/p/d874a05edf19
__EOF__