使用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),性能還有所提高。