python程序寫檔案與多程序記錄日誌
阿新 • • 發佈:2019-01-10
假設有個程序,一直在寫一個名字叫做1的檔案,然後我們在它執行的過程中將檔案改名了,會發生什麼事情呢?
寫個程式試試:
然後執行它,此時可以看到:
因為程序得到了檔案的控制代碼,所以就算這個檔案改名為2了,它也會繼續往2這個檔案寫入的。
這樣也就解釋了apache在linux啟動多個程序響應url請求時,呼叫TimeRotatingFileHandler時,第二個程序把第一個程序的日誌名錯誤改名為帶字尾的檔名,第一個程序也會依舊往帶字尾的檔案裡寫入後續的日誌。所以看起來xxx.log和xxx.log.20160417都不停的有18號的日誌寫入。
所以django在linux下多程序使用TimeRotatingFileHandler寫日誌會有問題。
目前看來,有2種方法處理多程序寫日誌的問題:
1.程序id加到檔名中,但是apache重啟時子程序id也會變;這樣可能存在多個非當天的日誌但不帶時間字尾(程序id不一樣)
2.使用concurrentlog第三方庫記錄日誌,下載地址:
https://pypi.python.org/pypi/ConcurrentLogHandler/0.9.1
經過和同事交流,得知一個多程序按日期寫日誌的庫。向作者致敬:
https://github.com/kieslee/mlogging