This commit is contained in:
2024-10-24 09:23:39 +08:00
parent 641c34b1b3
commit 16c005556f
36 changed files with 7780 additions and 0 deletions

163
SCLP/utils/logger.py Normal file
View File

@@ -0,0 +1,163 @@
# -*- coding:utf-8 -*-
"""
@Author : xuxingchen
@Contact : xuxingchen@sinochem.com
@Desc : 日志模块
"""
import sys
import io
import time
DEBUG = None
LOGGER_PATH = None
TOKEN_ERROR = "token无效"
def log(text: str, log_path: str = None):
"""打印日志"""
log_path = log_path if log_path else LOGGER_PATH
log_line = '[{}] {}'.format(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), text)
if log_path:
log_file = open(log_path, 'a', encoding='utf8')
log_file.write("{}\n".format(log_line))
log_file.close()
print(log_line)
def log_plus(text: str, log_path: str = None, prefix_text: str = None, suffix_text: str = None):
"""加强版打印日志,预置了不同文字颜色"""
log_path = log_path if log_path else LOGGER_PATH
if prefix_text:
log_line_start = f"[{time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())}] {prefix_text}"
else:
log_line_start = f"[{time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())}]"
if suffix_text:
log_line = f"{log_line_start} {text} {suffix_text}"
else:
log_line = f"{log_line_start} {text}"
if log_path:
log_file = open(log_path, 'a', encoding='utf8')
log_file.write("{}\n".format(log_line))
log_file.close()
print(log_line)
def format_text(text_list: list, align_list: list = None) -> str:
"""格式化一些文本信息, 可以根据 align_list 调整每列文本的距离"""
if not align_list:
align_list = [(30, '<'), (60, '<')]
formatted_text = []
for txt, (int_align, flag) in zip(text_list, align_list):
formatted_text.append(f'{txt:{flag}{int_align}}')
return ' '.join(formatted_text)
def new_dc(msgs: str | float | int, fore_color: str = "", back_color: str = "") -> str:
"""给文本上色
fore_color格式如下
[{显示方式};{前景色};{背景色}m
显示方式
0默认值、1高亮、22非粗体、4下划线、24非下划线、 5闪烁、25非闪烁、7反显、27非反显
前景色
30黑色、31红色、32绿色、 33黄色、34蓝色、35洋 红、36青色、37白色
背景色
40黑色、41红色、42绿色、 43黄色、44蓝色、45洋 红、46青色、47白色
如:
高亮绿色红色背景 [1;32;41m
默认-绿字体 [32m
"""
if fore_color == "":
fore_color = '[32m' # 默认绿色
return "\033{}{}{}\033[0m".format(back_color, fore_color, str(msgs))
def console_mute(func):
"""采用装饰器的方式提供函数的控制台标准输出临时置空,净化控制台环境"""
def wrapper(*args, **kwargs):
original_stdout = sys.stdout
try:
sys.stdout = io.StringIO()
return func(*args, **kwargs)
finally:
# 恢复原始的 sys.stdout 和 sys.stderr
sys.stdout = original_stdout
return wrapper
def log_speed_ms(start_time: float, suffix: str = "", prefix: str = "", number_color: str = "", decimal: int = 4):
"""控制台打印消耗的毫秒时间"""
log(f"{suffix}用时:{new_dc(str(round((time.time() - start_time) * 1000, decimal)), number_color)}ms{prefix}")
def speed_ms(start_time: float, decimal: int = 4):
"""消耗的毫秒时间"""
return round((time.time() - start_time) * 1000, decimal)
class Logger:
"""对控制台日志输出的二次封装,对部分常用日志进行预置"""
@staticmethod
def debug(text: str, log_path: str = None):
"""预置的debug形式的log"""
log_path = log_path if log_path else LOGGER_PATH
if isinstance(DEBUG, bool) and DEBUG:
log_plus(text, log_path, f"[{new_dc('INFO-DEBUG', '[34m')}]")
@staticmethod
def info(text: str, log_path: str = None):
"""预置的info形式的log"""
log_path = log_path if log_path else LOGGER_PATH
log_plus(text, log_path, f"[{new_dc('INFO', '[34m')}]")
@staticmethod
def error(text: str, log_path: str = None):
"""预置的error形式的log"""
log_path = log_path if log_path else LOGGER_PATH
log_plus(text, log_path, f"[{new_dc('ERROR', '[1;31m')}]")
@staticmethod
def warn(text: str, log_path: str = None):
"""预置的warn形式的log"""
log_path = log_path if log_path else LOGGER_PATH
log_plus(text, log_path, f"[{new_dc('WARN', '[1;33m')}]")
@staticmethod
def init(text: str, log_path: str = None):
"""预置的error形式的log"""
log_path = log_path if log_path else LOGGER_PATH
log_plus(text, log_path, f"[{new_dc('INIT', '[35m')}]")
@staticmethod
def title(text: str, log_path: str = None):
"""预置title形式的显目log"""
log_path = log_path if log_path else LOGGER_PATH
log_plus(new_dc(text, '[1m'), log_path, "🚀", "🚀")
@staticmethod
def complete(text: str, log_path: str = None):
"""预置complete形式的显目log"""
log_path = log_path if log_path else LOGGER_PATH
log_plus(new_dc(text, '[1;32m'), log_path, "", "")
@staticmethod
def remove(text: str, log_path: str = None):
"""预置remove形式的显目log"""
log_path = log_path if log_path else LOGGER_PATH
log_plus(new_dc(text, '[1m'), log_path, "🚮", "🚮")
@staticmethod
def connect(text: str, log_path: str = None):
"""预置connect形式的显目log"""
log_path = log_path if log_path else LOGGER_PATH
log_plus(new_dc(text, '[1;32m'), log_path, "🔗", "🔗")
@staticmethod
def disconnect(text: str, log_path: str = None):
"""预置disconnect形式的显目log"""
log_path = log_path if log_path else LOGGER_PATH
log_plus(new_dc(text, '[1m'), log_path, "🚫", "🚫")