""" Centralized logging configuration for microservices """ import logging import logging.config import os from typing import Dict, Any def setup_logging(service_name: str, log_level: str = "INFO") -> None: """Set up logging configuration for a microservice""" config: Dict[str, Any] = { "version": 1, "disable_existing_loggers": False, "formatters": { "standard": { "format": "%(asctime)s [%(levelname)s] %(name)s: %(message)s" }, "detailed": { "format": "%(asctime)s [%(levelname)s] %(name)s [%(filename)s:%(lineno)d] %(message)s" }, "json": { "()": "pythonjsonlogger.jsonlogger.JsonFormatter", "format": "%(asctime)s %(name)s %(levelname)s %(message)s" } }, "handlers": { "console": { "class": "logging.StreamHandler", "level": log_level, "formatter": "standard", "stream": "ext://sys.stdout" }, "file": { "class": "logging.FileHandler", "level": log_level, "formatter": "detailed", "filename": f"/var/log/{service_name}.log", "mode": "a" }, "logstash": { "class": "logstash.TCPLogstashHandler", "host": os.getenv("LOGSTASH_HOST", "localhost"), "port": int(os.getenv("LOGSTASH_PORT", "5000")), "version": 1, "message_type": "logstash", "fqdn": False, "tags": [service_name] } }, "loggers": { "": { "handlers": ["console", "file"], "level": log_level, "propagate": False }, "uvicorn": { "handlers": ["console"], "level": log_level, "propagate": False }, "uvicorn.access": { "handlers": ["console"], "level": log_level, "propagate": False } } } # Add logstash handler if in production if os.getenv("ENVIRONMENT") == "production": config["loggers"][""]["handlers"].append("logstash") logging.config.dictConfig(config) logger = logging.getLogger(__name__) logger.info(f"Logging configured for {service_name}")