import logging import os import sys from logging.config import dictConfig from pythonjsonlogger.json import JsonFormatter from pathlib import Path from datetime import datetime, timezone class ISOJsonFormatter(JsonFormatter): def formatTime(self, record, datefmt=None): dt = datetime.fromtimestamp(record.created, tz=timezone.utc) return dt.isoformat(timespec="milliseconds").replace("+00:00", "Z") LOG_LEVEL = os.getenv("MEDIAMANAGER_LOG_LEVEL", "INFO").upper() LOG_FILE = Path(os.getenv("LOG_FILE", "/app/config/media_manager.log")) LOGGING_CONFIG = { "version": 1, "disable_existing_loggers": False, "formatters": { "default": { "format": "%(asctime)s - %(levelname)s - %(name)s - %(funcName)s(): %(message)s" }, "json": { "()": ISOJsonFormatter, "format": "%(asctime)s %(levelname)s %(name)s %(message)s", "rename_fields": { "levelname": "level", "asctime": "timestamp", "name": "module", }, }, }, "handlers": { "console": { "class": "logging.StreamHandler", "formatter": "default", "stream": sys.stdout, }, "file": { "class": "logging.handlers.RotatingFileHandler", "formatter": "json", "filename": str(LOG_FILE), "maxBytes": 10485760, "backupCount": 5, "encoding": "utf-8", }, }, "root": { "level": LOG_LEVEL, "handlers": ["console", "file"], }, "loggers": { "uvicorn": {"handlers": ["console", "file"], "level": "DEBUG"}, "uvicorn.access": {"handlers": ["console", "file"], "level": "DEBUG"}, "fastapi": {"handlers": ["console", "file"], "level": "DEBUG"}, }, } def setup_logging(): dictConfig(LOGGING_CONFIG) logging.basicConfig( level=LOG_LEVEL, format="%(asctime)s - %(levelname)s - %(name)s - %(funcName)s(): %(message)s", stream=sys.stdout, ) logging.getLogger("urllib3").setLevel(logging.WARNING) logging.getLogger("requests").setLevel(logging.WARNING) logging.getLogger("transmission_rpc").setLevel(logging.WARNING) logging.getLogger("qbittorrentapi").setLevel(logging.WARNING) logging.getLogger("sabnzbd_api").setLevel(logging.WARNING)