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")
|