import logging import sys def setup_logging(level: str = "INFO", log_file: str | None = None) -> None: # Пишем в stderr для Docker и Celery. handlers: list[logging.Handler] = [logging.StreamHandler(sys.stderr)] if log_file: handlers.append(logging.FileHandler(log_file, encoding="utf-8")) for handler in handlers: handler.setLevel(getattr(logging, level.upper(), logging.INFO)) root = logging.getLogger() root.setLevel(getattr(logging, level.upper(), logging.INFO)) # Убираем старые хендлеры после fork. for old_handler in list(root.handlers): try: old_handler.close() except Exception: pass root.handlers.clear() for handler in handlers: root.addHandler(handler) root.propagate = False fmt = logging.Formatter( "%(asctime)s | %(levelname)s | %(name)s | %(message)s" ) for handler in root.handlers: handler.setFormatter(fmt) for logger_name in ( "celery.app.trace", "celery.worker.request", "celery.worker.strategy", ): noisy_logger = logging.getLogger(logger_name) noisy_logger.handlers.clear() noisy_logger.propagate = False noisy_logger.disabled = True