問題描述
專案過程中寫了乙個小模組,設計到了日誌儲存的問題,結果發現了個小問題。
**結構如下:
db.py
run.py
其中db.py是運算元據庫抽象出來的乙個類,run.py是業務邏輯**。兩個檔案中都有使用python自帶的logging模組,來記錄日誌。其中前者將日誌存入到db_***.log下,後者存入run_***.log下。
# db.py
import logging
import time
dt = time.time(
)logging.basicconfig(filename=
'db_'
+str
(dt)
+'.log'
, level=logging.info)
# run.py
import logging
import time
dt = time.time(
)logging.basicconfig(filename=
'run_'
+str
(dt)
+'.log'
, level=logging.info)
同時,在run.py中會呼叫db.py的函式,例如:
'''
'''# db.py
classdb(
):def__init__
(self)
: ***x
defselect
(self)
: logging.info(
'log from db.py'
)# run.py
from db import db
if __name__ ==
'__main__'
: db = db(
) db.select()
logging.info(
'log from run.py'
)
實際執行起來,發現所有的日誌都只會存在 db_***.log 中,同時並不會產生 run_***.log 檔案。
排錯猜測
依照上面的結果,猜測run.py檔案中,引入的db.py中也有logging的設定,但只會有乙個生效。
驗證 1
寫兩個py檔案first.py和second.py,在second中引用first的函式,看最終日誌的輸出檔名及順序。
內容分別為:
# first.py
import logging
class
test()
:def
__init__
(self, log_type, dt)
: dt =
str(dt)
logging.basicconfig(filename=
'./log/'
+ log_type +
'_'+ dt +
'.txt'
, level=logging.info)
deftest_log
(self)
: logging.info(
'log from first.py'
)# second.py
from first import test
import time
dt = time.time(
)import logging
logging.basicconfig(filename=
'./log/'
+'second.txt'
, level=logging.info)
logging.info(
'log from second'
)test = test(
'db'
, dt)
test.test_log(
)# 結果
➜ log_dir_test python second.py
➜ log_dir_test ls log
second.txt
➜ log_dir_test cat log/second.txt
info:root:log from second
info:root:log from first.py
可以看到,檔名為 second.txt,即採用了 second.py 的logging設定。同時,日誌輸出的順序也是先輸出 second 再是 first。
驗證 2
此時嘗試將second.py的語句順序做乙個調整,調整為下面:
'''
'''# second.py
from first import test
import time
dt = time.time(
)test = test(
'db'
, dt)
test.test_log(
)import logging
logging.basicconfig(filename=
'./log/'
+'second.txt'
, level=logging.info)
logging.info(
'log from second'
)# result
➜ log_dir_test cat log/db_1561088221.
83.txt
info:root:log from first.py
info:root:log from second
可以看到結果儲存到了 db_***.txt 中,即採用了 first.py 的logging設定。
驗證 3
再對second.py做調整:
# second.py
from first import test
import time
dt = time.time(
)test = test(
'db'
, dt)
import logging
logging.basicconfig(filename=
'./log/'
+'second.txt'
, level=logging.info)
logging.info(
'log from second'
)test.test_log(
)# result
➜ log_dir_test cat log/db_1561088393.
36.txt
info:root:log from second
info:root:log from first.py
採用了first.py的設定
驗證 4
繼續調整second.py:
'''
'''# second.py
from first import test
import time
import logging
logging.basicconfig(filename=
'./log/'
+'second.txt'
, level=logging.info)
dt = time.time(
)test = test(
'db'
, dt)
logging.info(
'log from second'
)test.test_log(
)# result
➜ log_dir_test cat log/second.txt
info:root:log from second
info:root:log from first.py
採用了 second.py 的設定
共性
可以發現,兩個檔案的logging設定,在second.py的順序,影響了second.py的logging設定。即:
解釋
起初覺得奇怪,現在想想還是比較容易理解的。
假如 second.py 中已經設定了logging,後面引用了first.py的函式,first.py中又設定了logging。若此時又採用 first.py的設定,那後續如果second.py中又使用了logging.***怎麼辦?也就是說,python會覺得混亂,不知所措……
解決辦法
如果還是想達到 db.py 操作都儲存到 db 相關目錄下,run日誌儲存到run目錄下怎麼辦?似乎沒太好的解決辦法;不優雅的處理方式,可以採用檔案操作……比方說使用with open(xx) as f去操作,這樣的話,比較繁瑣。
更好的辦法是什麼?就是現在python的這種機制。即 run.py 相關日誌都儲存到 run 目錄下,即使呼叫了 db.py 的函式,日誌也儲存到 run 目錄下。這樣可以保證 run.py 的日誌是全的,且時間順序是正確的,減少了排錯的成本。
Python logging模組學習
import logging 日誌級別列表,預設為logging.warning levels logging.notset,logging.debug,logging.info,logging.warning,logging.error,logging.critical log format as...
python logging模組簡介
logging模組是python內建的標準模組,主要用於輸出執行日誌,可以設定輸出日誌的等級 日誌儲存路徑 日誌檔案回滾等。相對於print,該模組具有可以決定在列印什麼級別的資訊和將資訊輸出放置在什麼地方的優點。配置logging的基本設定,並在控制台輸出 import logging loggi...
Python logging日誌模組
1.日誌的級別 日誌一共分成5個等級,從低到高分別是 1 debug 2.info 3.warning 4.error 5.critical說明 這5個等級,也分別對應5種打日誌的方法 debug info warning error critical。預設的是 warning,當在warning或...