一文搞定python的日誌自定義
阿新 • • 發佈:2018-12-02
在開發過程中,日誌是一個避不開的話題,有的時候我們不需要控制檯輸出過多的資訊,甚至不輸出,當然,我們可以在控制檯設定日誌的等級來達到目的,但是,日誌的儲存,日誌格式的重寫,這些,就必須用python內建的logging模組來實現了。
封裝一個通用的日誌指令碼
命名為logge.py
,程式碼如下
import os import time import logging #返回一個logger例項,如果沒有指定name,返回root logger。 # 只要name相同,返回的logger例項都是同一個而且只有一個,即name和logger例項是一一對應的。 # 這意味著,無需把logger例項在各個模組中傳遞。只要知道name,就能得到同一個logger例項。 logger = logging.getLogger('mylogger') # 設定總日誌級別, 也可以給不同的handler設定不同的日誌級別 #設定logger的level, level有以下幾個級別: # 級別高低順序:NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL # 如果把looger的級別設定為INFO, 那麼小於INFO級別的日誌都不輸出, 大於等於INFO級別的日誌都輸出 logger.setLevel(logging.DEBUG) # 控制檯日誌和日誌檔案使用同一個formatter,formatter用於描述日誌的格式 formatter = logging.Formatter( '%(asctime)s - %(filename)s[line:%(lineno)d] - <%(threadName)s %(thread)d>' + '- <Process %(process)d> - %(levelname)s: %(message)s' ) # asctime:日誌產生的時間;filename:產生日誌的指令碼檔名;lineno:該指令碼檔案哪一行程式碼產生了日誌 # threadName: 當前執行緒名;thread: 當前程序名;Process程序同thread執行緒 # levelname: logger的級別;meesage: 具體的日誌資訊 # 建立Handler, 輸出日誌到控制檯和檔案 # 日誌檔案FileHandler basedir = os.path.abspath(".") #返回指令碼所在的絕對路徑 log_dir = os.path.join(basedir, 'logs') # 日誌檔案所在目錄,即‘指令碼路徑/logs' if not os.path.isdir(log_dir): os.mkdir(log_dir) filename = time.strftime('%Y-%m-%d-%H-%M-%S', time.localtime(time.time())) + '.log' # 日誌檔名,以當前時間命名 file_handler = logging.FileHandler(os.path.join(log_dir, filename)) # 建立日誌檔案handler file_handler.setFormatter(formatter) # 設定Formatter file_handler.setLevel(logging.INFO) # 單獨設定日誌檔案的日誌級別 # 控制檯日誌StreamHandler stream_handler = logging.StreamHandler() stream_handler.setFormatter(formatter) # stream_handler.setLevel(logging.INFO) # 單獨設定控制檯日誌的日誌級別,註釋掉則使用總日誌級別 # 將handler新增到logger中 logger.addHandler(file_handler) logger.addHandler(stream_handler)
程式碼有詳細的註釋,有問題歡迎評論。
如何使用
假如我們在test.py
需要用到儲存日誌,可以這樣:
from logger import logger
#從logger.py檔案裡匯入logger變數
for i in range(5):
logger.info("這是第"+str(i+1)+"條日誌")
#logger.debug("")
#logger.error("")
控制檯列印如下:
…/logs資料夾下也產生了日誌檔案2018-11-24-19-14-05.log
,其內容如下
over!