""" Logging configuration for Telegram Archiver. Supports both console and file output with OpenTelemetry integration. """ import logging import sys from pathlib import Path from typing import Optional from opentelemetry import trace from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import ConsoleSpanExporter, SimpleSpanProcessor from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor def setup_logging( log_level: str = "INFO", log_file: Optional[Path] = None, enable_otel: bool = False, ) -> None: """ Configure logging for the application. Args: log_level: Logging level (DEBUG, INFO, WARNING, ERROR) log_file: Optional file path for log output enable_otel: Enable OpenTelemetry tracing """ # Create root logger root_logger = logging.getLogger() root_logger.setLevel(getattr(logging, log_level.upper())) # Clear existing handlers root_logger.handlers.clear() # Console handler console_handler = logging.StreamHandler(sys.stdout) console_handler.setLevel(getattr(logging, log_level.upper())) console_formatter = logging.Formatter( "%(asctime)s - %(name)s - %(levelname)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S", ) console_handler.setFormatter(console_formatter) root_logger.addHandler(console_handler) # File handler (if specified) if log_file: file_handler = logging.FileHandler(log_file, encoding="utf-8") file_handler.setLevel(getattr(logging, log_level.upper())) file_formatter = logging.Formatter( "%(asctime)s - %(name)s - %(levelname)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S", ) file_handler.setFormatter(file_formatter) root_logger.addHandler(file_handler) # OpenTelemetry configuration if enable_otel: setup_opentelemetry() def setup_opentelemetry() -> None: """Configure OpenTelemetry tracing.""" # Set up tracer provider trace.set_tracer_provider(TracerProvider()) # Add console exporter (for debugging) trace.get_tracer_provider().add_span_processor( SimpleSpanProcessor(ConsoleSpanExporter()) ) logger = logging.getLogger(__name__) logger.info("OpenTelemetry tracing enabled") def get_logger(name: str) -> logging.Logger: """ Get a logger instance with the specified name. Args: name: Logger name (usually __name__) Returns: Configured logger instance """ return logging.getLogger(name)