1. 程式人生 > >一文搞定python的日誌自定義

一文搞定python的日誌自定義

在開發過程中,日誌是一個避不開的話題,有的時候我們不需要控制檯輸出過多的資訊,甚至不輸出,當然,我們可以在控制檯設定日誌的等級來達到目的,但是,日誌的儲存,日誌格式的重寫,這些,就必須用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!