From d3d7e268e50691e161bff5edb74683dbd50fadcf Mon Sep 17 00:00:00 2001 From: SBCrumb Date: Sun, 7 Sep 2025 13:45:11 -0400 Subject: [PATCH] add loggin --- VERSION | 2 +- webhook_server.py | 69 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 8cbf02c..43b2961 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.0.12 +0.0.13 diff --git a/webhook_server.py b/webhook_server.py index db04ca8..f96d229 100644 --- a/webhook_server.py +++ b/webhook_server.py @@ -49,6 +49,8 @@ import json import asyncio import glob import re +import logging +import logging.handlers from pathlib import Path from datetime import datetime, timezone, timedelta from fastapi import FastAPI, HTTPException, BackgroundTasks, Request @@ -67,9 +69,71 @@ import time # Import TV helpers from your existing module from media_date_cache import ( db_connect, apply_series, parse_imdb_from_path, - _log, _iso_now, SonarrClient + _log as _original_log, _iso_now, SonarrClient ) +# --------------------------- +# Enhanced logging with file support +# --------------------------- + +# Global file logger +_file_logger = None + +def _setup_file_logging(): + """Setup file logging for NFOGuard""" + global _file_logger + if _file_logger is not None: + return _file_logger + + # Create logs directory + log_dir = Path("/app/data/logs") + log_dir.mkdir(parents=True, exist_ok=True) + + # Setup rotating file handler + log_file = log_dir / "nfoguard.log" + _file_logger = logging.getLogger("NFOGuard") + _file_logger.setLevel(logging.DEBUG) + + # Rotating file handler (10MB max, 5 backups) + file_handler = logging.handlers.RotatingFileHandler( + log_file, maxBytes=10*1024*1024, backupCount=5 + ) + + # Detailed format for file logging + formatter = logging.Formatter( + '[%(asctime)s] %(levelname)s: %(message)s', + datefmt='%Y-%m-%dT%H:%M:%S+00:00' + ) + file_handler.setFormatter(formatter) + _file_logger.addHandler(file_handler) + + return _file_logger + +def _log(level: str, msg: str): + """Enhanced logging that writes to both console and file""" + # Call original log for console output + _original_log(level, msg) + + # Also log to file + try: + file_logger = _setup_file_logging() + if level == "DEBUG": + file_logger.debug(msg) + elif level == "INFO": + file_logger.info(msg) + elif level == "WARNING": + file_logger.warning(msg) + elif level == "ERROR": + file_logger.error(msg) + else: + file_logger.info(f"{level}: {msg}") + except Exception as e: + # Don't let logging errors break the app + print(f"File logging error: {e}") + +# Initialize file logging on startup +_setup_file_logging() + # --------------------------- # Models # --------------------------- @@ -1085,6 +1149,9 @@ def apply_movie(movie_dir: Path, conn: sqlite3.Connection): conn.commit() _log("INFO", f"Processed movie: {movie_dir.name} (source={src_detail or 'unknown'}; preserved={preserve})") + + # Add detailed logging for debugging with searchable format + _log("INFO", f"MOVIE_SUMMARY: imdb={imdb_id} title='{movie_dir.name}' dateadded={dateadded_iso} source={src_detail} preserved={preserve}") # --------------------------- # Batching