alkaid_release_platform/core/logger.py

83 lines
2.7 KiB
Python
Raw Normal View History

import logging
import sys
import os
TRACE = 5
DEBUG = logging.DEBUG
INFO = logging.INFO
WARNING = logging.WARNING
ERROR = logging.ERROR
CRITICAL = logging.CRITICAL
NOTSET = logging.NOTSET
def get_logger(name=None):
if name is None:
name = 'alkaid_release_platform'
# 创建一个 logger
logger = logging.getLogger(name)
if logger.handlers:
return logger
#定义一个新的日志级别用于输出trace信息
logging.TRACE = TRACE
logging.addLevelName(logging.TRACE, "TRACE")
def trace(self, message, *args, **kws):
self._log(logging.TRACE, message, args, **kws)
logging.Logger.trace = trace
logger.setLevel(INFO)
class LogColors:
RESET = "\033[0m"
TRACE = "\033[35m" # 紫色
DEBUG = "\033[34m" # 蓝色
INFO = "\033[32m" # 绿色
WARNING = "\033[33m" # 黄色
ERROR = "\033[31m" # 红色
CRITICAL = "\033[41m" # 红底白字
# 创建一个log的颜色格式化器使得输出的log信息在控制台上有颜色区分
class ColoredFormatter(logging.Formatter):
def __init__(self, msg, use_color=True):
logging.Formatter.__init__(self, msg)
self.use_color = use_color
def format(self, record):
level_color = {
logging.TRACE: LogColors.TRACE,
logging.DEBUG: LogColors.DEBUG,
logging.INFO: LogColors.INFO,
logging.WARNING: LogColors.WARNING,
logging.ERROR: LogColors.ERROR,
logging.CRITICAL: LogColors.CRITICAL
}
color = level_color.get(record.levelno, LogColors.RESET)
message = super().format(record)
return f"{color}{message}{LogColors.RESET}" if os.isatty(sys.stdout.fileno()) else message
# 创建一个带颜色的控制台处理器
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(INFO)
# 创建一个带颜色的格式化器并将其添加到处理器
formatter = ColoredFormatter('[%(asctime)s][%(levelname)s][%(filename)s:%(lineno)d]: %(message)s')
console_handler.setFormatter(formatter)
# 将处理器添加到 logger
logger.addHandler(console_handler)
# 定义一个方法,用于设置日志级别,并将其绑定到 logger 对象
def set_level(self, level):
lv_map = {
"trace":TRACE,
"debug":DEBUG,
"info":INFO,
"warning":WARNING,
"error":ERROR,
"critical":CRITICAL
}
level = lv_map.get(level, DEBUG)
for handler in self.handlers:
handler.setLevel(level)
logger.setLevel(level)
logging.Logger.set_level = set_level
return logger