#!/usr/bin/env python3 # -*- coding:utf-8 -*- import logging import logging.config import sys import os import colorlog class logs(): _initialized = False def __init__(self): self.logger = logging.getLogger("TGPlatform") self.fatal = self.critical def setConfig(self, conf): 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 if not conf['enable']: logs._initialized = True return logPath = conf.get('logpath', '') if not logPath: logPath = os.path.join(os.path.dirname(__file__), 'logFile') 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 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): self.logger.critical(msg) @join def critical(self, msg): self.logger.critical(msg) log = logs()