2026-03-02 14:29:58 +08:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
# -*- coding:utf-8 -*-
|
|
|
|
|
import logging
|
2026-04-17 15:31:41 +08:00
|
|
|
import logging.config
|
2026-03-02 14:29:58 +08:00
|
|
|
import sys
|
|
|
|
|
import os
|
|
|
|
|
import colorlog
|
|
|
|
|
|
2026-04-17 15:31:41 +08:00
|
|
|
|
2026-03-02 14:29:58 +08:00
|
|
|
class logs():
|
2026-04-17 15:31:41 +08:00
|
|
|
_initialized = False
|
|
|
|
|
|
2026-03-02 14:29:58 +08:00
|
|
|
def __init__(self):
|
2026-04-17 15:31:41 +08:00
|
|
|
self.logger = logging.getLogger("TGPlatform")
|
2026-03-02 14:29:58 +08:00
|
|
|
self.fatal = self.critical
|
|
|
|
|
|
|
|
|
|
def setConfig(self, conf):
|
2026-04-17 15:31:41 +08:00
|
|
|
if logs._initialized:
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
# 配置验证
|
|
|
|
|
required_keys = ['name', 'enable', 'console', 'journal', 'level', 'when', 'backupcount']
|
|
|
|
|
for key in required_keys:
|
|
|
|
|
if key not in conf:
|
|
|
|
|
print(f"[日志配置错误] 缺少必填字段: {key}")
|
|
|
|
|
return
|
2026-03-02 14:29:58 +08:00
|
|
|
|
2026-04-17 15:31:41 +08:00
|
|
|
if not conf['enable']:
|
|
|
|
|
logs._initialized = True
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
logPath = conf.get('logpath', '')
|
2026-03-02 14:29:58 +08:00
|
|
|
if not logPath:
|
|
|
|
|
logPath = os.path.join(os.path.dirname(__file__), 'logFile')
|
|
|
|
|
|
2026-04-17 15:31:41 +08:00
|
|
|
try:
|
|
|
|
|
os.makedirs(logPath, 0o755, True)
|
|
|
|
|
except Exception as e:
|
|
|
|
|
print(f"[日志错误] 创建日志目录失败: {e}")
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
log_file = os.path.join(logPath, conf['name'])
|
|
|
|
|
level = conf['level'].upper()
|
|
|
|
|
|
|
|
|
|
# 构建 dictConfig
|
|
|
|
|
handlers = {}
|
|
|
|
|
handler_list = []
|
|
|
|
|
|
|
|
|
|
if conf['console']:
|
|
|
|
|
handlers['console'] = {
|
|
|
|
|
'class': 'logging.StreamHandler',
|
|
|
|
|
'level': level,
|
|
|
|
|
'formatter': 'colored',
|
|
|
|
|
'stream': 'ext://sys.stdout'
|
|
|
|
|
}
|
|
|
|
|
handler_list.append('console')
|
|
|
|
|
|
|
|
|
|
if conf['journal']:
|
|
|
|
|
handlers['file'] = {
|
|
|
|
|
'class': 'logging.handlers.TimedRotatingFileHandler',
|
|
|
|
|
'level': level,
|
|
|
|
|
'formatter': 'colored',
|
|
|
|
|
'filename': log_file,
|
|
|
|
|
'when': conf['when'],
|
|
|
|
|
'backupCount': conf['backupcount'],
|
|
|
|
|
'encoding': 'utf-8'
|
|
|
|
|
}
|
|
|
|
|
handler_list.append('file')
|
|
|
|
|
|
|
|
|
|
config_dict = {
|
|
|
|
|
'version': 1,
|
|
|
|
|
'disable_existing_loggers': False,
|
|
|
|
|
'formatters': {
|
|
|
|
|
'colored': {
|
|
|
|
|
'()': 'colorlog.ColoredFormatter',
|
|
|
|
|
'format': '{log_color}[{asctime}]|{levelname}{message}',
|
|
|
|
|
'datefmt': '%m-%d %H:%M:%S',
|
|
|
|
|
'style': '{'
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
'handlers': handlers,
|
|
|
|
|
'loggers': {
|
|
|
|
|
'TGPlatform': {
|
|
|
|
|
'handlers': handler_list,
|
|
|
|
|
'level': level,
|
|
|
|
|
'propagate': False
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
logging.config.dictConfig(config_dict)
|
|
|
|
|
except Exception as e:
|
|
|
|
|
print(f"[日志错误] 日志配置失败: {e}")
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
logs._initialized = True
|
2026-03-02 14:29:58 +08:00
|
|
|
|
|
|
|
|
def join(func):
|
|
|
|
|
def s(self, *args, **kwargs):
|
|
|
|
|
back_frame = sys._getframe().f_back
|
|
|
|
|
back_filename = os.path.basename(back_frame.f_code.co_filename)
|
|
|
|
|
back_lineno = back_frame.f_lineno
|
|
|
|
|
_args = f'[{back_filename}:{back_lineno}]'
|
|
|
|
|
n = '-' * (10 - len(func.__name__))
|
|
|
|
|
_args = f'{n}{_args}'
|
|
|
|
|
n = ' ' * (40 - len(func.__name__ + _args))
|
|
|
|
|
_args = f'{_args}{n}: '
|
|
|
|
|
for i in args:
|
|
|
|
|
_args = _args + str(i)
|
|
|
|
|
result = func(self, _args, **kwargs)
|
|
|
|
|
return result
|
|
|
|
|
return s
|
|
|
|
|
|
|
|
|
|
@join
|
|
|
|
|
def debug(self, msg):
|
|
|
|
|
self.logger.debug(msg)
|
|
|
|
|
|
|
|
|
|
@join
|
|
|
|
|
def info(self, msg):
|
|
|
|
|
self.logger.info(msg)
|
|
|
|
|
|
|
|
|
|
@join
|
|
|
|
|
def warning(self, msg):
|
|
|
|
|
self.logger.warning(msg)
|
|
|
|
|
|
|
|
|
|
@join
|
|
|
|
|
def error(self, msg):
|
|
|
|
|
self.logger.error(msg)
|
|
|
|
|
|
|
|
|
|
@join
|
|
|
|
|
def fatal(self, msg):
|
2026-04-17 15:31:41 +08:00
|
|
|
self.logger.critical(msg)
|
2026-03-02 14:29:58 +08:00
|
|
|
|
|
|
|
|
@join
|
|
|
|
|
def critical(self, msg):
|
|
|
|
|
self.logger.critical(msg)
|
|
|
|
|
|
2026-04-17 15:31:41 +08:00
|
|
|
|
2026-03-02 14:29:58 +08:00
|
|
|
log = logs()
|