| import logging
|
| from datetime import datetime
|
| from collections import deque
|
| from threading import Lock
|
|
|
| DEBUG = False
|
|
|
| LOG_FORMAT_DEBUG = '%(asctime)s - %(levelname)s - [%(key)s]-%(request_type)s-[%(model)s]-%(status_code)s: %(message)s - %(error_message)s'
|
| LOG_FORMAT_NORMAL = '[%(asctime)s] [%(levelname)s] [%(key)s]-%(request_type)s-[%(model)s]-%(status_code)s: %(message)s'
|
|
|
|
|
| logger = logging.getLogger("my_logger")
|
| logger.setLevel(logging.DEBUG)
|
|
|
|
|
| console_handler = logging.StreamHandler()
|
| console_formatter = logging.Formatter('%(message)s')
|
| console_handler.setFormatter(console_formatter)
|
| logger.addHandler(console_handler)
|
|
|
|
|
| class LogManager:
|
| def __init__(self, max_logs=100):
|
| self.logs = deque(maxlen=max_logs)
|
| self.lock = Lock()
|
|
|
| def add_log(self, log_entry):
|
| with self.lock:
|
| self.logs.append(log_entry)
|
|
|
| def get_recent_logs(self, count=50):
|
| with self.lock:
|
| return list(self.logs)[-count:]
|
|
|
|
|
| log_manager = LogManager()
|
|
|
| def format_log_message(level, message, extra=None):
|
| extra = extra or {}
|
| log_values = {
|
| 'asctime': datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
|
| 'levelname': level,
|
| 'key': extra.get('key', 'N/A'),
|
| 'request_type': extra.get('request_type', 'N/A'),
|
| 'model': extra.get('model', 'N/A'),
|
| 'status_code': extra.get('status_code', 'N/A'),
|
| 'error_message': extra.get('error_message', ''),
|
| 'message': message
|
| }
|
| log_format = LOG_FORMAT_DEBUG if DEBUG else LOG_FORMAT_NORMAL
|
| formatted_log = log_format % log_values
|
|
|
|
|
| log_entry = {
|
| 'timestamp': datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
|
| 'level': level,
|
| 'key': extra.get('key', 'N/A'),
|
| 'request_type': extra.get('request_type', 'N/A'),
|
| 'model': extra.get('model', 'N/A'),
|
| 'status_code': extra.get('status_code', 'N/A'),
|
| 'message': message,
|
| 'error_message': extra.get('error_message', ''),
|
| 'formatted': formatted_log
|
| }
|
| log_manager.add_log(log_entry)
|
|
|
| return formatted_log
|
|
|
| def log(level: str, message: str, **extra):
|
| """简化日志记录的统一函数"""
|
| msg = format_log_message(level.upper(), message, extra=extra)
|
| getattr(logger, level.lower())(msg) |