Python的logging模組的研究

2021-10-07 09:32:16 字數 2532 閱讀 8879

最有用的話寫在最前面:

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...