Python | Logging實現日誌輸出到文件

記錄下Python中使用Logging實現日誌輸出到文件,實例如下:

# -*- coding: UTF-8 -*- 
#!/usr/bin/python 

import logging 
from logging import handlers
 
# 創建一個logger並設置日誌等級
logger = logging.getLogger()
logger.setLevel(logging.INFO) 

# 定義日誌文件
logFile = './sdkup.log'

# 創建一個FileHandler,並將日誌寫入指定的日誌文件中
fileHandler = logging.FileHandler(logFile, mode='a')
fileHandler.setLevel(logging.INFO) 
 
 # 或者創建一個StreamHandler,將日誌輸出到控制檯
streamHandler = logging.StreamHandler()
streamHandler.setLevel(logging.INFO)

# 定義Handler的日誌輸出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fileHandler.setFormatter(formatter)
 
# 定義日誌滾動條件,這裏按日期-天保留日誌
timedRotatingFileHandler = handlers.TimedRotatingFileHandler(filename=logFile, when='D')
timedRotatingFileHandler.setLevel(logging.INFO)
timedRotatingFileHandler.setFormatter(formatter)

# 添加Handler
logger.addHandler(fileHandler)
logger.addHandler(streamHandler)
logger.addHandler(timedRotatingFileHandler)

if __name__ == '__main__':
    logger.debug('Debug')
    logger.info('Info')
    logger.critical('Critical')

其中Formatter是給handler設置的,因爲handler是負責把日誌輸出到哪裏,所以是給它設置格式,而不是給logger;

那爲什麼level需要設置兩次呢?

給logger設置是告訴它要記錄哪些級別的日誌,給handler設是告訴它要輸出哪些級別的日誌,相當於進行兩次過濾。

這樣的好處在於,當有多個日誌去向時,比如既保存到文件,又輸出到控制檯,就可以分別給它們設置不同的級別;

logger 的級別是先過濾的,所以被 logger 過濾的日誌 handler 也是無法記錄的,這樣就可以只改 logger 的級別而影響所有輸出。

兩者結合可以更方便地管理日誌記錄的級別。

而Formatter可以指定輸出的內容和格式,其內置的參數如下:

%(name)s:Logger的名字
%(levelno)s:打印日誌級別的數值
%(levelname)s:打印日誌級別的名稱
%(pathname)s:打印當前執行程序的路徑,其實就是sys.argv[0]
%(filename)s:打印當前執行程序名
%(funcName)s:打印日誌的當前函數
%(lineno)d:打印日誌的當前行號
%(asctime)s:打印日誌的時間
%(thread)d:打印線程ID
%(threadName)s:打印線程名稱
%(process)d:打印進程ID
%(message)s:打印日誌信息

另外python在自動分割日誌文件方面提供了兩個處理器,如下:


handlers.RotatingFileHandler -> 按照大小自動分割日誌文件,一旦達到指定的大小重新生成文件
handlers.TimedRotatingFileHandler -> 按照時間自動分割日誌文件

 

 

更多實例參照敬請右轉學習:  https://www.cnblogs.com/nancyzhu/p/8551506.html

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章