chore: initial commit

This commit is contained in:
你的用户名
2025-11-01 21:58:31 +08:00
commit 0406b5664f
101 changed files with 20458 additions and 0 deletions

91
enhanced_logger.py Normal file
View File

@@ -0,0 +1,91 @@
#!/usr/bin/env python3
"""
增强型日志系统 - 不删档、自动轮转、详细记录
"""
import logging
import os
from logging.handlers import RotatingFileHandler, TimedRotatingFileHandler
from datetime import datetime
import json
class EnhancedLogger:
def __init__(self, name, log_dir="./logs"):
self.name = name
self.log_dir = log_dir
self.logger = logging.getLogger(name)
os.makedirs(log_dir, exist_ok=True)
os.makedirs(f"{log_dir}/archive", exist_ok=True)
self.logger.setLevel(logging.DEBUG)
self.logger.handlers = []
self._setup_handlers()
def _setup_handlers(self):
# 1. 控制台输出
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
console_formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
console_handler.setFormatter(console_formatter)
self.logger.addHandler(console_handler)
# 2. 详细日志按日期轮转保留90天
detailed_log = f"{self.log_dir}/{self.name}_detailed.log"
detailed_handler = TimedRotatingFileHandler(
detailed_log, when='midnight', interval=1,
backupCount=90, encoding='utf-8'
)
detailed_handler.setLevel(logging.DEBUG)
detailed_handler.suffix = "%Y%m%d"
detailed_formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - [%(filename)s:%(lineno)d] - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
detailed_handler.setFormatter(detailed_formatter)
self.logger.addHandler(detailed_handler)
# 3. 错误日志50MB轮转
error_log = f"{self.log_dir}/{self.name}_errors.log"
error_handler = RotatingFileHandler(
error_log, maxBytes=50*1024*1024, backupCount=10, encoding='utf-8'
)
error_handler.setLevel(logging.ERROR)
error_formatter = logging.Formatter(
'%(asctime)s - %(levelname)s - [%(filename)s:%(lineno)d]\n%(message)s\n' + '='*80,
datefmt='%Y-%m-%d %H:%M:%S'
)
error_handler.setFormatter(error_formatter)
self.logger.addHandler(error_handler)
# 4. 审计日志(永久保存)
audit_log = f"{self.log_dir}/audit_{datetime.now().strftime('%Y%m')}.log"
audit_handler = logging.FileHandler(audit_log, encoding='utf-8')
audit_handler.setLevel(logging.INFO)
audit_formatter = logging.Formatter(
'%(asctime)s - %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
audit_handler.setFormatter(audit_formatter)
self.logger.addHandler(audit_handler)
def get_logger(self):
return self.logger
def log_user_action(self, user_id, action, details=None):
msg = f"[用户操作] user_id={user_id}, action={action}"
if details:
msg += f", details={details}"
self.logger.info(msg)
def log_api_call(self, api_name, params=None, response=None, error=None):
msg = f"[API调用] {api_name}"
if params:
msg += f", params={params}"
if error:
self.logger.error(f"{msg}, error={error}")
else:
self.logger.info(msg)
def get_enhanced_logger(name="bot", log_dir="./logs"):
return EnhancedLogger(name, log_dir).get_logger()