基于python 标准库logging二次封装实现不同级别日志不同颜色输出、按天生成日志文件功能

import logging.handlers
import datetime


class ColoredFormatter(logging.Formatter):
    COLOR_CODES = {
        'DEBUG': '\033[94m',  # 蓝色
        'INFO': '\033[92m',  # 绿色
        'WARNING': '\033[93m',  # 黄色
        'ERROR': '\033[91m',  # 红色
        'CRITICAL': '\033[91m'  # 红色
    }
    RESET_CODE = '\033[0m'

    def format(self, record):
        levelname = record.levelname
        message = super().format(record)
        color_code = self.COLOR_CODES.get(levelname, '')
        reset_code = self.RESET_CODE if color_code else ''
        formatted_message = f'{color_code}{message}{reset_code}'
        return formatted_message


class ColoredFileHandler(logging.FileHandler):
    def __init__(self, log_dir=None, mode='a', encoding=None, delay=False):
        today = datetime.date.today()
        if log_dir:
            filename = f'{log_dir}/server.{today.strftime("%Y-%m-%d")}.log'
        else:
            filename = f'server.{today.strftime("%Y-%m-%d")}.log'
        super().__init__(filename, mode, encoding, delay)


def logger(log_dir=None, level='DEBUG'):
    log = logging.getLogger()
    level = getattr(logging, level)
    log.setLevel(level)

    console_handler = logging.StreamHandler()
    console_handler.setLevel(level)
    console_formatter = ColoredFormatter('%(asctime)s  %(levelname)s %(lineno)d --- [%(filename)s] : %(message)s')
    console_handler.setFormatter(console_formatter)
    log.addHandler(console_handler)
    file_handler = ColoredFileHandler(log_dir)
    file_handler.setLevel(level)
    file_formatter = logging.Formatter('%(asctime)s  %(levelname)s %(lineno)d --- [%(filename)s] : %(message)s')
    file_handler.setFormatter(file_formatter)
    log.addHandler(file_handler)

    return log


__all__ = ['logger']

if __name__ == '__main__':
    logger = logger()
    logger.debug('This is a debug message')
    logger.info('This is an info message')
    logger.warning('This is a warning message')
    logger.error('This is an error message')
    logger.critical('This is a critical message')

效果:
image

posted @   时光煮酒丶  阅读(188)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示