92 lines
3.4 KiB
Python
92 lines
3.4 KiB
Python
#!/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()
|