使用flask时候,我们经常使用logging来写日志。
但是gunicorn是多进程启动的,logging进程不安全!
日志经常会缺,只有一部分日志。
就算整合到gunicorn的日志中
if __name__ != '__main__':
gunicorn_logger = logging.getLogger('gunicorn.error')
app.logger.handlers = gunicorn_logger.handlers
app.logger.setLevel(gunicorn_logger.level)
还是只有部分日志。
问题苦恼了我很久,今天无意间发现了一个包concurrent_log
https://github.com/huanghyw/concurrent_log
可以解决此类问题,具体使用方法在git上很明白,我就不赘述了。
源码也简单看了看,很简洁,简单的思想就是用了2个锁。
一个锁是静态变量,基于GIL就可以保证python的线程安全。
另一个是进程锁,用的是PortaLock文件锁,实现了nt和posix,所以大部分部署gunicorn的地方都能用。
concurrent_log就可以分别保证线程和进程安全,就git作者的测试来说(500k行log),性能还有所提高。