Python Log終端輸出個性化顏色日志信息


一、日志顏色配置

首先要引入colorlog模塊,其默認的顏色配置如下:

default_log_colors = {
    'DEBUG': 'white',
    'INFO': 'green',
    'WARNING': 'yellow',
    'ERROR': 'red',
    'CRITICAL': 'bold_red',
}

根據這個配置,可以在自己的日志模塊中配置自己的個性化顏色搭配,比如:

log_colors_config = {
    # 終端輸出日志顏色配置
    'DEBUG': 'white',
    'INFO': 'cyan',
    'WARNING': 'yellow',
    'ERROR': 'red',
    'CRITICAL': 'bold_red',
}

然后在設置輸出格式-控制台,如下:

formatter = colorlog.ColoredFormatter(default_formats["color_format"], log_colors=color_config)

最終實現效果,如下:

二、日志代碼

import logging
import os
import colorlog
from logging.handlers import RotatingFileHandler
from datetime import datetime

cur_path = os.path.dirname(os.path.realpath(__file__))  # 當前項目路徑
log_path = os.path.join(os.path.dirname(cur_path), 'logs')  # log_path為存放日志的路徑
if not os.path.exists(log_path): os.mkdir(log_path)  # 若不存在logs文件夾,則自動創建

log_colors_config = {
    # 終端輸出日志顏色配置
    'DEBUG': 'white',
    'INFO': 'cyan',
    'WARNING': 'yellow',
    'ERROR': 'red',
    'CRITICAL': 'bold_red',
}

default_formats = {
    # 終端輸出格式
    'color_format': '%(log_color)s%(asctime)s-%(name)s-%(filename)s-[line:%(lineno)d]-%(levelname)s-[日志信息]: %(message)s',
    # 日志輸出格式
    'log_format': '%(asctime)s-%(name)s-%(filename)s-[line:%(lineno)d]-%(levelname)s-[日志信息]: %(message)s'
}


class HandleLog:
    """
    先創建日志記錄器(logging.getLogger),然后再設置日志級別(logger.setLevel),
    接着再創建日志文件,也就是日志保存的地方(logging.FileHandler),然后再設置日志格式(logging.Formatter),
    最后再將日志處理程序記錄到記錄器(addHandler)
    """

    def __init__(self):
        self.__now_time = datetime.now().strftime('%Y-%m-%d')  # 當前日期格式化
        self.__all_log_path = os.path.join(log_path, self.__now_time + "-all" + ".log")  # 收集所有日志信息文件
        self.__error_log_path = os.path.join(log_path, self.__now_time + "-error" + ".log")  # 收集錯誤日志信息文件
        self.__logger = logging.getLogger()  # 創建日志記錄器
        self.__logger.setLevel(logging.DEBUG)  # 設置默認日志記錄器記錄級別

    @staticmethod
    def __init_logger_handler(log_path):
        """
        創建日志記錄器handler,用於收集日志
        :param log_path: 日志文件路徑
        :return: 日志記錄器
        """
        # 寫入文件,如果文件超過1M大小時,切割日志文件,僅保留3個文件
        logger_handler = RotatingFileHandler(filename=log_path, maxBytes=1 * 1024 * 1024, backupCount=3, encoding='utf-8')
        return logger_handler

    @staticmethod
    def __init_console_handle():
        """創建終端日志記錄器handler,用於輸出到控制台"""
        console_handle = colorlog.StreamHandler()
        return console_handle

    def __set_log_handler(self, logger_handler, level=logging.DEBUG):
        """
        設置handler級別並添加到logger收集器
        :param logger_handler: 日志記錄器
        :param level: 日志記錄器級別
        """
        logger_handler.setLevel(level=level)
        self.__logger.addHandler(logger_handler)

    def __set_color_handle(self, console_handle):
        """
        設置handler級別並添加到終端logger收集器
        :param console_handle: 終端日志記錄器
        :param level: 日志記錄器級別
        """
        console_handle.setLevel(logging.DEBUG)
        self.__logger.addHandler(console_handle)

    @staticmethod
    def __set_color_formatter(console_handle, color_config):
        """
        設置輸出格式-控制台
        :param console_handle: 終端日志記錄器
        :param color_config: 控制台打印顏色配置信息
        :return:
        """
        formatter = colorlog.ColoredFormatter(default_formats["color_format"], log_colors=color_config)
        console_handle.setFormatter(formatter)

    @staticmethod
    def __set_log_formatter(file_handler):
        """
        設置日志輸出格式-日志文件
        :param file_handler: 日志記錄器
        """
        formatter = logging.Formatter(default_formats["log_format"], datefmt='%a, %d %b %Y %H:%M:%S')
        file_handler.setFormatter(formatter)

    @staticmethod
    def __close_handler(file_handler):
        """
        關閉handler
        :param file_handler: 日志記錄器
        """
        file_handler.close()

    def __console(self, level, message):
        """構造日志收集器"""
        all_logger_handler = self.__init_logger_handler(self.__all_log_path)  # 創建日志文件
        error_logger_handler = self.__init_logger_handler(self.__error_log_path)
        console_handle = self.__init_console_handle()

        self.__set_log_formatter(all_logger_handler)  # 設置日志格式
        self.__set_log_formatter(error_logger_handler)
        self.__set_color_formatter(console_handle, log_colors_config)

        self.__set_log_handler(all_logger_handler)  # 設置handler級別並添加到logger收集器
        self.__set_log_handler(error_logger_handler, level=logging.ERROR)
        self.__set_color_handle(console_handle)

        if level == 'info':
            self.__logger.info(message)
        elif level == 'debug':
            self.__logger.debug(message)
        elif level == 'warning':
            self.__logger.warning(message)
        elif level == 'error':
            self.__logger.error(message)
        elif level == 'critical':
            self.__logger.critical(message)

        self.__logger.removeHandler(all_logger_handler)  # 避免日志輸出重復問題
        self.__logger.removeHandler(error_logger_handler)
        self.__logger.removeHandler(console_handle)

        self.__close_handler(all_logger_handler)  # 關閉handler
        self.__close_handler(error_logger_handler)

    def debug(self, message):
        self.__console('debug', message)

    def info(self, message):
        self.__console('info', message)

    def warning(self, message):
        self.__console('warning', message)

    def error(self, message):
        self.__console('error', message)

    def critical(self, message):
        self.__console('critical', message)


log = HandleLog()

if __name__ == '__main__':
    log.info("這是日志信息")
    log.debug("這是debug信息")
    log.warning("這是警告信息")
    log.error("這是錯誤日志信息")
    log.critical("這是嚴重級別信息")


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM