Files
telegram-customer-bot/enhanced_logger.py
2025-11-01 21:58:31 +08:00

92 lines
3.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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()