Python之logging模塊使用技巧

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')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章