众所周知日志是我们排查问题和跟隔壁团队撕逼的最佳利器, 真的很重要防止被甩锅(血泪教训), 在一次撕扯中我去线上查看日志发现很多重要证据都没有记录在文件中, 经过对比发现肯定了发生了日志丢失问题, 直接导致本该10分钟解决的战斗,愣是持续了2个小时。
言归正传, 我们的程序是用gunicorn作为我们的应用服务器, 开启CUP核数+1个进程, 放在docker容器中部署多个服务器。
发生日志丢失最关键的因素在于, 我们的服务开启了多个进程, 而我们python自带的logging模块只是保证线程安全(可以看源码发现在写入文件前是会加锁的)的不保证进程安全, 所以导致在多进程的情况下会发生日志错乱, 丢失等情况。
那怎么解决呢?其实很简单,前人有轮子啊, https://github.com/wandaoe/concurrent_log 直接安装 pip install consurrent, 然后替换对应的handle就可以了,详细可以查看链接。
当然如果你看了这个开源包的代码就知道, 它在进程层面加了一个文件锁, 原理很简单在写入日志前创建一个文件, 然后写完就删除文件, 其他进程在写入日志前,先判断这个文件存不存在 ,如果存在就等待, 如果不存在就自己创建文件,然后写入然后再删除文件, 这就是在进程层面加的锁, 其实如果想效率更高, 可以引入基于redis分布式锁,就是如果系统不大的话, 引入这个比较麻烦。