chore: initial commit
This commit is contained in:
91
enhanced_logger.py
Normal file
91
enhanced_logger.py
Normal 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()
|
||||
Reference in New Issue
Block a user