From 49ceb0159dc3ab109bfffb47245c2b0d522b8065 Mon Sep 17 00:00:00 2001 From: AI Assistant Date: Thu, 12 Mar 2026 14:14:51 +0900 Subject: [PATCH] Enhance docker logging for debugging (Python unbuffered, GORM logger, yt-dlp debug wrapper) --- Dockerfile | 3 +++ backend/handlers/api.go | 5 ++++- backend/models/db.go | 16 +++++++++++++++- worker/downloader.py | 7 +++++++ 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 954760e..8e4a4f1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,6 +11,9 @@ RUN cd backend && CGO_ENABLED=1 go build -o /app/main main.go # 2. Final Minimal Image (Python + Go binary + Frontend) FROM python:3.10-slim +# 파이썬 출력 버퍼링을 비활성화하여 도커 로그에 즉각 표시되도록 설정합니다. +ENV PYTHONUNBUFFERED=1 + # Install system dependencies (ffmpeg is required for yt-dlp) RUN apt-get update && apt-get install -y \ ffmpeg \ diff --git a/backend/handlers/api.go b/backend/handlers/api.go index 3d5a47e..7f6b06f 100644 --- a/backend/handlers/api.go +++ b/backend/handlers/api.go @@ -106,10 +106,13 @@ func DownloadMedia(c *fiber.Ctx) error { } cmd := exec.Command("python", args...) + fmt.Printf("[DEBUG Go Exec] Command: %v\n", cmd.String()) + output, err := cmd.CombinedOutput() + fmt.Printf("[DEBUG Go Exec] Output:\n%s\n", string(output)) if err != nil { - fmt.Println("Download error:", string(output)) + fmt.Printf("[DEBUG Go Exec] Download error: %v\n", string(output)) BroadcastProgress("Error: " + err.Error()) models.DB.Create(&models.MediaHistory{ SourceURL: req.URL, diff --git a/backend/models/db.go b/backend/models/db.go index 19b0c90..d347c0e 100644 --- a/backend/models/db.go +++ b/backend/models/db.go @@ -2,9 +2,11 @@ package models import ( "log" + "os" "gorm.io/driver/sqlite" "gorm.io/gorm" + "gorm.io/gorm/logger" ) var DB *gorm.DB @@ -19,8 +21,20 @@ type MediaHistory struct { func InitDB(dbPath string) { var err error + + // 도커 로그 디버깅을 위해 SQL 쿼리를 디테일하게 출력하는 로거 설정 + newLogger := logger.New( + log.New(os.Stdout, "\r\n", log.LstdFlags), + logger.Config{ + LogLevel: logger.Info, + Colorful: true, + }, + ) + log.Println("Connecting to SQLite at:", dbPath) - DB, err = gorm.Open(sqlite.Open(dbPath), &gorm.Config{}) + DB, err = gorm.Open(sqlite.Open(dbPath), &gorm.Config{ + Logger: newLogger, + }) if err != nil { log.Fatal("Failed to connect to database:", err) } diff --git a/worker/downloader.py b/worker/downloader.py index 7363e09..2f1ec09 100644 --- a/worker/downloader.py +++ b/worker/downloader.py @@ -3,13 +3,16 @@ import json import subprocess import os import argparse +import traceback def download_and_crop(url, output_dir, start_time=None, end_time=None): + print(f"[DEBUG Worker] Starting download job for URL={url}, start={start_time}, end={end_time}", file=sys.stderr) try: os.makedirs(output_dir, exist_ok=True) # Get video info info_cmd = ["yt-dlp", "-J", url] + print(f"[DEBUG Worker] Running info command: {' '.join(info_cmd)}", file=sys.stderr) result = subprocess.run(info_cmd, capture_output=True, text=True, check=True) info = json.loads(result.stdout) @@ -53,14 +56,18 @@ def download_and_crop(url, output_dir, start_time=None, end_time=None): ] # Execute + print(f"[DEBUG Worker] Executing download command: {' '.join(download_args)}", file=sys.stderr) subprocess.run(download_args, check=True) print(json.dumps({"status": "success", "filepath": filepath, "title": title})) return True except subprocess.CalledProcessError as e: + print(f"[DEBUG Worker] Command Error Output: {e.stderr or e.output}", file=sys.stderr) print(json.dumps({"status": "error", "message": f"Command failed: {e.stderr or e.output}"})) return False except Exception as e: + print(f"[DEBUG Worker] Unexpected Exception:", file=sys.stderr) + traceback.print_exc() print(json.dumps({"status": "error", "message": str(e)})) return False