Python之logging模塊使用技巧
使用方法都寫在程序裏面的註釋中,請盡情享用,如果您覺得不錯可以點個贊哦🙂
代碼如下:
"""日誌一共分爲5個級別,從低到高分別是: DEBUG、INFO、WARNING、ERROR、CRITICAL (所有的默認級別都是 WARNING)
1. DEBUG: # 程序調試信息,通常只會出現在診斷問題上
2. INFO: # 程序運行正常,增加一些提示信息
3. WARNING: # 程序警告信息,用於一些突發事件
4. ERROR: # 比較嚴重的問題,程序沒能執行一些功能
5. CRITICAL: # 十分嚴重的錯誤,程序可能會中斷或者崩潰
<<日誌格式說明>>
%(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 # 打印日誌信息
<<常用格式>>
這個格式可以輸出日誌的打印時間,模塊名[代碼所在行數],日誌級別,以及輸出的日誌內容
format = '%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s'
"""
# -*- coding:utf-8 -*-
import logging
__author__ = 'Evan'
def simple_logger(save_log_path='', file_mode='a',
format_info='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s',
level_info=logging.INFO):
"""
打印日誌消息到控制檯,或保存日誌消息到文件中
:param save_log_path: 日誌文件保存路徑,默認爲空,如果傳入有效的文件路徑,控制檯則不打印日誌消息,僅保存日誌消息到文件中
:param file_mode: 文檔打開模式,默認爲追加模式
:param format_info: 日誌格式,默認是輸出日誌的打印時間,模塊名,輸出的日誌級別,以及輸入的日誌內容。
:param level_info: 日誌級別,默認是 INFO,只有大於等於該等級的消息纔會被記錄
:return:
"""
logging.basicConfig(filename=save_log_path, filemode=file_mode, level=level_info, format=format_info)
# logging test
logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')
logging.error('This is error message')
logging.critical('This is critical message')
def full_logger(save_log_path, file_mode='a',
format_info='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s'):
"""
打印日誌消息到控制檯,並保存日誌消息到文件中
:param save_log_path: 日誌文件保存路徑
:param file_mode: 文檔打開模式,默認爲追加模式
:param format_info: 日誌格式,默認是輸出日誌的打印時間,模塊名,輸出的日誌級別,以及輸入的日誌內容。
:return:
"""
# 第一步,創建一個logger
logger = logging.getLogger(__name__) # __name__是以當前的模塊名做爲對象名,默認是RootLogger
logger.setLevel(logging.DEBUG) # Log等級總開關,(設置級別後,不管是輸出到文件還是控制檯都要大於等於該級別纔會被記錄)
# 第二步,創建一個handler,用於寫入日誌文件
fh = logging.FileHandler(save_log_path, mode=file_mode)
fh.setLevel(logging.DEBUG) # 輸出到file的log等級的開關
fh.setFormatter(logging.Formatter(format_info)) # 定義handler的輸出格式
logger.addHandler(fh) # 將logger添加到handler裏面
# 第三步,再創建一個handler,用於輸出到控制檯
ch = logging.StreamHandler()
ch.setLevel(logging.WARNING) # 輸出到console的log等級的開關
ch.setFormatter(logging.Formatter(format_info)) # 定義handler的輸出格式
logger.addHandler(ch) # 將logger添加到handler裏面
# logger test
logger.debug('This is debug message')
logger.info('This is info message')
logger.warning('This is warning message')
logger.error('This is error message')
logger.critical('This is critical message')
# logging異常處理
try:
raise ValueError('Value error')
except Exception as ex:
logger.exception(ex) # 異常信息會被添加到日誌消息中
if __name__ == '__main__':
# TODO 僅打印日誌消息到控制檯,不保存
# logger_sample()
# 在當前路徑下創建simple_logger.txt,保存日誌消息到其中,不打印消息到控制檯
simple_logger(save_log_path='./simple_logger.txt', file_mode='w')
# 在當前路徑下創建full_logger.txt,保存日誌消息到其中,並打印消息到控制檯
full_logger(save_log_path='./full_logger.txt', file_mode='w')