問題描述
項目過程中寫了一個小子產品,設計到了日志存儲的問題,結果發現了個小問題。
代碼結構如下:
其中db.py是操作資料庫抽象出來的一個類,run.py是業務邏輯代碼。兩個檔案中都有使用Python自帶的logging子產品,來記錄日志。其中前者将日志存入到db_xxx.log下,後者存入run_xxx.log下。
兩者logging相關代碼為:
同時,在run.py中會調用db.py的函數,例如:
實際運作起來,發現所有的日志都隻會存在 db_xxx.log 中,同時并不會産生 run_xxx.log 檔案。
排錯
猜測
依照上面的結果,猜測run.py檔案中,引入的db.py中也有logging的設定,但隻會有一個生效。
驗證 1
寫兩個py檔案first.py和second.py,在second中引用first的函數,看最終日志的輸出檔案名及順序。
内容分别為:
可以看到,檔案名為 second.txt,即采用了 second.py 的logging設定。同時,日志輸出的順序也是先輸出 second 再是 first。
驗證 2
此時嘗試将second.py的語句順序做一個調整,調整為下面:
可以看到結果存儲到了 db_xxx.txt 中,即采用了 first.py 的logging設定。
驗證 3
再對second.py做調整:
采用了first.py的設定
驗證 4
繼續調整second.py:
采用了 second.py 的設定
共性
可以發現,兩個檔案的logging設定,在second.py的順序,影響了second.py的logging設定。即:
當 first.py 的logging設定在前的時候,采用first.py的設定
反正,采用second.py的設定
隻采用其中一個設定
解釋
起初覺得奇怪,現在想想還是比較容易了解的。
假如 second.py 中已經設定了logging,後面引用了first.py的函數,first.py中又設定了logging。若此時又采用 first.py的設定,那後續如果second.py中又使用了logging.xxx怎麼辦?也就是說,Python會覺得混亂,不知所措……
解決辦法
如果還是想達到 db.py 操作都存儲到 db 相關目錄下,run日志存儲到run目錄下怎麼辦?似乎沒太好的解決辦法;不優雅的處理方式,可以采用檔案操作……比方說使用with open(xx) as f去操作,這樣的話,比較繁瑣。
更好的辦法是什麼?就是現在Python的這種機制。即 run.py 相關日志都存儲到 run 目錄下,即使調用了 db.py 的函數,日志也存儲到 run 目錄下。這樣可以保證 run.py 的日志是全的,且時間順序是正确的,減少了排錯的成本。