天天看點

Python logging子產品日志存儲位置踩坑

問題描述

項目過程中寫了一個小子產品,設計到了日志存儲的問題,結果發現了個小問題。

代碼結構如下:

其中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 的日志是全的,且時間順序是正确的,減少了排錯的成本。