93 lines
2.8 KiB
Python
93 lines
2.8 KiB
Python
![]() |
import logging
|
|||
|
import sys
|
|||
|
from fileinput import filename
|
|||
|
|
|||
|
from colorlog import ColoredFormatter
|
|||
|
|
|||
|
# 创建一个 logger
|
|||
|
logger = logging.getLogger('my_logger')
|
|||
|
logger.setLevel(logging.DEBUG)
|
|||
|
|
|||
|
# 创建一个控制台处理器
|
|||
|
console_handler = logging.StreamHandler()
|
|||
|
|
|||
|
# 定义 SUCCESS 级别的数值 (INFO=20, WARNING=30,所以 SUCCESS 可以设为 25)
|
|||
|
SUCCESS = 25
|
|||
|
logging.addLevelName(SUCCESS, "SUCCESS")
|
|||
|
|
|||
|
# 定义一个 success 方法
|
|||
|
def success(self, message, *args, **kwargs):
|
|||
|
if self.isEnabledFor(SUCCESS):
|
|||
|
self._log(SUCCESS, message, args, **kwargs)
|
|||
|
|
|||
|
# 绑定到 Logger 类上
|
|||
|
logging.Logger.success = success
|
|||
|
|
|||
|
|
|||
|
# 创建带颜色的格式化器(用于控制台输出)
|
|||
|
console_formatter = ColoredFormatter(
|
|||
|
"%(log_color)s%(asctime)s - %(filename)s:%(lineno)d - [%(levelname)s]:%(message)s",
|
|||
|
datefmt="%Y-%m-%d %H:%M:%S",
|
|||
|
reset=True,
|
|||
|
log_colors={
|
|||
|
'SUCCESS': 'green', # 这里定义 SUCCESS 级别的颜色
|
|||
|
'DEBUG': 'cyan',
|
|||
|
'INFO': 'white',
|
|||
|
'WARNING': 'yellow',
|
|||
|
'ERROR': 'red',
|
|||
|
'CRITICAL': 'red,bg_black',
|
|||
|
},
|
|||
|
secondary_log_colors={
|
|||
|
'message': {
|
|||
|
'SUCCESS': 'green', # 这里定义 SUCCESS 级别的消息颜色
|
|||
|
'DEBUG': 'cyan',
|
|||
|
'INFO': 'white',
|
|||
|
'WARNING': 'yellow',
|
|||
|
'ERROR': 'red',
|
|||
|
'CRITICAL': 'red,bg_black',
|
|||
|
}
|
|||
|
},
|
|||
|
style='%'
|
|||
|
)
|
|||
|
|
|||
|
# 创建普通格式的格式化器(用于日志文件)
|
|||
|
file_formatter = logging.Formatter(
|
|||
|
"%(asctime)s - %(filename)s:%(lineno)d - %(levelname)s:%(name)s:%(message)s",
|
|||
|
datefmt="%Y-%m-%d %H:%M:%S"
|
|||
|
)
|
|||
|
|
|||
|
# 设置格式化器
|
|||
|
console_handler.setFormatter(console_formatter)
|
|||
|
|
|||
|
# 将处理器添加到 logger
|
|||
|
logger.addHandler(console_handler)
|
|||
|
|
|||
|
def set_logger_file_handler(p):
|
|||
|
# 创建一个文件处理器,保存日志到本地文件
|
|||
|
file_handler = logging.FileHandler(f'{p}/run.log', encoding='utf-8')
|
|||
|
file_handler.setFormatter(file_formatter)
|
|||
|
logger.addHandler(file_handler)
|
|||
|
|
|||
|
# 重定向 stdout 和 stderr 到日志系统
|
|||
|
class LoggerWriter:
|
|||
|
def __init__(self, level):
|
|||
|
self.level = level
|
|||
|
|
|||
|
def write(self, message):
|
|||
|
if message.strip(): # 过滤掉空行
|
|||
|
self.level(message.strip()) # 去掉首尾空白字符
|
|||
|
|
|||
|
def flush(self):
|
|||
|
pass
|
|||
|
|
|||
|
sys.stdout = LoggerWriter(logger.info)
|
|||
|
sys.stderr = LoggerWriter(logger.error)
|
|||
|
|
|||
|
# 测试日志
|
|||
|
# logger.success("This is a debug message")
|
|||
|
# 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")
|