"""Logging configuration for wikijs-python-sdk.""" import logging import json import sys from typing import Any, Dict, Optional from datetime import datetime class JSONFormatter(logging.Formatter): """JSON formatter for structured logging.""" def format(self, record: logging.LogRecord) -> str: """Format log record as JSON. Args: record: The log record to format Returns: JSON formatted log string """ log_data: Dict[str, Any] = { "timestamp": datetime.utcnow().isoformat(), "level": record.levelname, "logger": record.name, "message": record.getMessage(), "module": record.module, "function": record.funcName, "line": record.lineno, } # Add exception info if present if record.exc_info: log_data["exception"] = self.formatException(record.exc_info) # Add extra fields if hasattr(record, "extra"): log_data.update(record.extra) return json.dumps(log_data) def setup_logging( level: int = logging.INFO, format_type: str = "json", output_file: Optional[str] = None ) -> logging.Logger: """Setup logging configuration. Args: level: Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL) format_type: "json" or "text" output_file: Optional file path for log output Returns: Configured logger """ logger = logging.getLogger("wikijs") logger.setLevel(level) # Remove existing handlers logger.handlers.clear() # Create handler if output_file: handler = logging.FileHandler(output_file) else: handler = logging.StreamHandler(sys.stdout) # Set formatter if format_type == "json": formatter = JSONFormatter() else: formatter = logging.Formatter( "%(asctime)s - %(name)s - %(levelname)s - %(message)s" ) handler.setFormatter(formatter) logger.addHandler(handler) return logger # Create default logger logger = setup_logging()