Files
chronicle.nixg.ru/telegram-archiver/app/logger.py
T

98 lines
2.8 KiB
Python

"""
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
# OpenTelemetry is optional - skip if not installed
try:
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import ConsoleSpanExporter, SimpleSpanProcessor
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
OTEL_AVAILABLE = True
except ImportError:
OTEL_AVAILABLE = False
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."""
if not OTEL_AVAILABLE:
logger = logging.getLogger(__name__)
logger.warning("OpenTelemetry not available - tracing disabled")
return
# 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)