最有用的話寫在最前面:
logger可以看成乙個寫日誌的人。
handler可以看成一支寫日誌的筆。
乙個人可以有很多筆。可以換著寫。
今天想在python裡做乙個自動生成日誌的工具。
生成的日誌類似於
aabbcc2020062118.001.log
aabbcc2020062118.002.log
aabbcc2020062119.001.log
網上推薦使用logging外掛程式。然後就開始坑爹了。
需要解決幾個問題。
能寫入日誌。
能在檔案中新增時間戳。
能按001,002的格式自增。
為了實現上述目標,需要按照某個規則在滿足規則時換個日誌名。
最簡單的logging使用方式如下:
logging.basicconfig(level=logging.debug,
format
='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s'
, datefmt=
'%a, %d %b %y %h:%m:%s'
, filename=
, filemode=
'w')
logging.debug(
'this is debug message'
)logging.info(
'this is info message'
)logging.warning(
'this is warning message'
)
最初想的是再寫一遍logging.basicconfig,改掉裡面的filename。
實驗之後不可以,貌似因為basicconfig是全域性配置。設定了就不能動了。
然後嘗試找到按照上文進行寫日誌之後的logger和handler是什麼。經過研究,沒有發現有方法可以獲得這些資訊。
因此只能使用python2的方式建立logger和handler,方法如下:
import logging
# 1、建立乙個logger
logger = logging.getlogger(
'mylogger'
)logger.setlevel(logging.debug)
# 2、建立乙個handler,用於寫入日誌檔案
fh = logging.filehandler(
'test.log'
)fh.setlevel(logging.debug)
# 再建立乙個handler,用於輸出到控制台
ch = logging.streamhandler(
)ch.setlevel(logging.debug)
# 3、定義handler的輸出格式(formatter)
formatter = logging.formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)# 4、給handler新增formatter
fh.setformatter(formatter)
ch.setformatter(formatter)
# 5、給logger新增handler
logger.addhandler(fh)
logger.addhandler(ch)
# 6、寫入日誌
logger.error(
"try to log sth."
)
然後可以在控制台和檔案裡看到寫入的日誌。
這時候變更日誌名,可以使用
logger.removehandler(fh)
fh=logging.filehandler("newname.log")
logger.addhandler(fh)
但是這樣還有個問題,在removehandler的時候,不知道為什麼fh原來的的屬性(formatter,level…)也被removed。所以新的handler必須重新新增一次屬性。
logger.removehandler(fh)
fh=logging.filehandler("newname.log")
fh.setformatter(formatter)
fh.setlevel(logging.debug)
logger.addhandler(fh)
這樣雖然能達到效果,但是具體原因還是不明。
另:
logging外掛程式提供了logging.handlers.rotatingfilehandler和logging.handlers.timedrotatingfilehandler兩種特殊的handler,分別是按大小劃分和按時間劃分。
但是生成的格式跟我要的不一樣。 所以也用不上。
遞迴練習 shutil模組 logging模組
os模組 檢視乙個資料夾下的所有檔案,這個資料夾下面還有資料夾,不能用walk import os defshow file path name lst os.listdir path for name in name lst abs path os.path.join path,name if o...
使用python的logging模組
一 從乙個使用場景開始 開發乙個日誌系統,既要把日誌輸出到控制台,還要寫入日誌檔案 import logging 建立乙個logger logger logging.getlogger mylogger logger.setlevel logging.debug 建立乙個handler,用於寫入日誌...
Python中logging的使用
我們先來看一下函式式簡單配置 預設情況下python的logging模組將日誌列印到了標準輸出中,且只顯示了大於等於warning級別的日誌,這說明預設的日誌級別設定為warning 日誌級別等級critical error warning info debug 預設的日誌格式為日誌級別 logge...