logging模塊
python標準庫自帶的日誌模塊
設置日誌級別
需要導入日誌模塊
import logging
Logging 中幾種級別:DEBUG < INFO < WARNING < ERROR < CRITICAL
日誌等級 | 描述 |
---|---|
DEBUG | 調試信息通常在診斷問題的時候用得着 |
INFO | 普通信息認程序按照預期運行 |
WARNING | 警告信息表示發生意想不到的事情或者指示接下來可能會出現一些問題但是程序還是繼續運行 |
ERROR | 錯誤信息程序運行中出現了一些問題程序某些功能不能執行 |
CRITICAL | 危險信息一個嚴重的錯誤導致程序無法繼續運行 |
#設置日誌級別 注意大寫
logging.basicConfig(level=logging.INFO)
# debug調試信息
logging.debug('this is debug')
# 普通信息
logging.info('this is debug')
# 警告信息
logging.warning('this is debug')
# 錯誤信息
logging.error('this is debug')
# 危險信息
logging.critical('this is critical')
#當級別不夠INFO等級的,不會提示
配置格式
格式 | 描述 |
---|---|
%(asctime)s | 日誌事件發生的時間 |
%(levelname)s | 該日誌記錄的日誌級別 |
%(message)s | 日誌記錄的文本內容 |
**%(name)s | 所使用的日誌器名稱,默認是’root’ |
%(pathname)s | 調用日誌記錄函數的文件的全路徑 |
%(filename)s | 調用日誌記錄函數的文件 |
%(funcName)s | 調用日誌記錄函數的函數名 |
%(lineno)d | 調用日誌記錄函數的代碼所在的行號 |
logging.basicConfig(level=logging.INFO,format ='時間:%(asctime)s 日誌級別:%(levelname)s 日誌內容:%(message)s 行數:%(lineno)d')
日誌寫入文件
logging.basicConfig(level = logging.INFO, #寫入的級別
format='%(asctime)s,%(filename)s,%(lineno)s', #寫入文件的格式
filename='jiuchengdebug.log', #寫入文件的文件名
filemode='a+') #寫入的模式
模塊化組件
logging模塊還提供了模塊化組件的方法來靈活配置日誌記錄器
組件 | 說明 |
---|---|
Loggers(日誌記錄器) | 提供程序直接使用的接口 |
Handlers(日誌處理器) | 將記錄的日誌發送到指定的位置 |
Filters(日誌過濾器) | 用於過濾特定的日誌記錄 |
Formatters(日誌格式器) | 用於控制日誌信息的輸出格式 |
流程如下
import logging
# 創建一個logger
my_logger = logging.getLogger('test_log')
# 設置級別
my_logger.setLevel(logging.DEBUG)
# 定義handler
# 在控制檯輸出
my_handCmd = logging.StreamHandler()
my_handCmd.setLevel(logging.DEBUG)
# 在文件中顯示
my_handFile = logging.FileHandler('ftest.log', encoding='utf-8',mode='a+')
my_handFile.setLevel(logging.DEBUG)
# 格式化輸出
Cmdformatter = logging.Formatter(
'時間:%(asctime)s,'
'日誌級別:%(levelname)s'
'日誌消息:%(message)s'
)
Fileformatter = logging.Formatter('時間:%(asctime)s,日誌級別:%(levelname)s,日誌內容:%(message)s,行數:%(lineno)d')
# 以什麼樣的格式輸出
my_handCmd.setFormatter(Cmdformatter)
my_handFile.setFormatter(Fileformatter)
# 將logger添加到handle裏面
my_logger.addHandler(my_handCmd)
my_logger.addHandler(my_handFile)
#使用
# debug調試信息
my_logger.debug('this is debug')
# 普通信息
my_logger.info('this is debug')
# 警告信息
my_logger.warning('this is debug')
# 錯誤信息
my_logger.error('this is debug')
# 危險信息
my_logger.critical('this is critical')
#以上代碼就實現了一個同時在控制檯輸出日誌信息和文件寫入日誌信息的日誌管理器
封裝示例
import logging
class My_logger:
def __init__(self,log_name,log_level = logging.DEBUG,log_file = 'myfile.log'):
"""
:param log_name: 日誌名稱
:param log_level:日誌級別
:param log_file:日誌文件名
"""
self.logger_name = log_name
self.logger_lever = log_level
self.logger_file = log_file
#創建logger對象
def create_Logger(self):
my_logger = logging.getLogger(self.logger_name)
my_logger.setLevel(self.logger_lever)
#創建文件處理器
my_handFile = logging.FileHandler(self.logger_file, encoding='utf-8', mode='a+')
my_handFile.setLevel(self.logger_lever)
#創建控制檯處理器,在控制檯輸出
my_handCmd = logging.StreamHandler()
my_handCmd.setLevel(self.logger_lever)
# 設置輸出格式
Cmd_formatter = logging.Formatter('時間:%(asctime)s,'
'日誌級別:%(levelname)s,'
'消息文件:%(filename)s,'
'日誌內容:%(message)s,'
'行數:%(lineno)d。'
'\r\n\n')
File_formatter = logging.Formatter('時間:%(asctime)s,'
'日誌級別:%(levelname)s,'
'消息文件:%(filename)s,'
'日誌內容:%(message)s,'
'行數:%(lineno)d。'
'\r\n\n')
# 以什麼樣的格式輸出,將格式添加到處理器中
my_handCmd.setFormatter(Cmd_formatter)
my_handFile.setFormatter(File_formatter)
# 將handle添加到logger裏面
my_logger.addHandler(my_handCmd)
my_logger.addHandler(my_handFile)
#返回創建的logger對象
return my_logger
if __name__ == '__main__':
log = My_logger('my',logging.DEBUG).create_Logger()
try:
print(a)
except Exception as e:
log.debug(e)