import logging import os import sys from datetime import datetime from logging.handlers import RotatingFileHandler from typing import Optional from pythonjsonlogger import jsonlogger def setup_logger( name: str = "security_monitor", log_file: str = "logs/app.log", level: str = "INFO", format: str = "%(asctime)s - %(name)s - %(levelname)s - %(message)s", max_size: str = "100MB", backup_count: int = 5, json_format: bool = False, ) -> logging.Logger: logger = logging.getLogger(name) logger.setLevel(getattr(logging, level.upper(), logging.INFO)) if logger.handlers: for handler in logger.handlers: logger.removeHandler(handler) os.makedirs(os.path.dirname(log_file), exist_ok=True) if json_format: handler = RotatingFileHandler( log_file, maxBytes=int(max_size.replace("MB", "")) * 1024 * 1024, backupCount=backup_count, encoding="utf-8", ) formatter = jsonlogger.JsonFormatter( "%(asctime)s %(name)s %(levelname)s %(message)s", rename_fields={"levelname": "severity", "asctime": "timestamp"}, ) handler.setFormatter(formatter) else: handler = RotatingFileHandler( log_file, maxBytes=int(max_size.replace("MB", "")) * 1024 * 1024, backupCount=backup_count, encoding="utf-8", ) formatter = logging.Formatter(format) handler.setFormatter(formatter) logger.addHandler(handler) console_handler = logging.StreamHandler(sys.stdout) console_handler.setFormatter(logging.Formatter(format)) logger.addHandler(console_handler) return logger def get_logger(name: str = "security_monitor") -> logging.Logger: return logging.getLogger(name) class LoggerMixin: @property def logger(self) -> logging.Logger: return get_logger(self.__class__.__name__) def log_execution_time(logger: Optional[logging.Logger] = None): def decorator(func): import time from functools import wraps @wraps(func) def wrapper(*args, **kwargs): log = logger or get_logger(func.__module__) start_time = time.time() result = func(*args, **kwargs) end_time = time.time() log.info( f"函数执行完成", extra={ "function": func.__name__, "execution_time_ms": int((end_time - start_time) * 1000), }, ) return result return wrapper return decorator def log_function_call(logger: Optional[logging.Logger] = None): def decorator(func): from functools import wraps @wraps(func) def wrapper(*args, **kwargs): log = logger or get_logger(func.__module__) log.info( f"函数调用", extra={ "function": func.__name__, "args": str(args), "kwargs": str(kwargs), }, ) return func(*args, **kwargs) return wrapper return decorator