眾所周知日志是我們排查問題和跟隔壁團隊撕逼的最佳利器, 真的很重要防止被甩鍋(血淚教訓), 在一次撕扯中我去線上查看日志發現很多重要證據都沒有記錄在文件中, 經過對比發現肯定了發生了日志丟失問題, 直接導致本該10分鍾解決的戰斗,愣是持續了2個小時。
言歸正傳, 我們的程序是用gunicorn作為我們的應用服務器, 開啟CUP核數+1個進程, 放在docker容器中部署多個服務器。
發生日志丟失最關鍵的因素在於, 我們的服務開啟了多個進程, 而我們python自帶的logging模塊只是保證線程安全(可以看源碼發現在寫入文件前是會加鎖的)的不保證進程安全, 所以導致在多進程的情況下會發生日志錯亂, 丟失等情況。
那怎么解決呢?其實很簡單,前人有輪子啊, https://github.com/wandaoe/concurrent_log 直接安裝 pip install consurrent, 然后替換對應的handle就可以了,詳細可以查看鏈接。
當然如果你看了這個開源包的代碼就知道, 它在進程層面加了一個文件鎖, 原理很簡單在寫入日志前創建一個文件, 然后寫完就刪除文件, 其他進程在寫入日志前,先判斷這個文件存不存在 ,如果存在就等待, 如果不存在就自己創建文件,然后寫入然后再刪除文件, 這就是在進程層面加的鎖, 其實如果想效率更高, 可以引入基於redis分布式鎖,就是如果系統不大的話, 引入這個比較麻煩。