From d86f59ced17c4e526f0f3169e451880476b19c5d Mon Sep 17 00:00:00 2001 From: pythongosssss <125205205+pythongosssss@users.noreply.github.com> Date: Tue, 27 Aug 2024 21:27:24 +0100 Subject: [PATCH] Add route for getting output logs --- api_server/routes/internal/internal_routes.py | 10 +++++++++ app/log_interceptor.py | 21 +++++++++++++++++++ main.py | 7 ++++++- server.py | 8 ++++--- 4 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 app/log_interceptor.py diff --git a/api_server/routes/internal/internal_routes.py b/api_server/routes/internal/internal_routes.py index 2234b3113..c998f1e0a 100644 --- a/api_server/routes/internal/internal_routes.py +++ b/api_server/routes/internal/internal_routes.py @@ -2,6 +2,7 @@ from aiohttp import web from typing import Optional from folder_paths import models_dir, user_directory, output_directory from api_server.services.file_service import FileService +from app.log_interceptor import logs class InternalRoutes: ''' @@ -31,6 +32,15 @@ class InternalRoutes: except Exception as e: return web.json_response({"error": str(e)}, status=500) + @self.routes.get('/logs') + async def get_logs(request): + return web.json_response([ + { + 'timestamp': dt.isoformat(), + 'message': message + } + for dt, message in logs + ]) def get_app(self): if self._app is None: diff --git a/app/log_interceptor.py b/app/log_interceptor.py new file mode 100644 index 000000000..011aac701 --- /dev/null +++ b/app/log_interceptor.py @@ -0,0 +1,21 @@ +import io +import threading +from datetime import datetime + +from collections import deque +logs = deque(maxlen=300) + +class LogInterceptor(io.TextIOWrapper): + def __init__(self, stream, *args, **kwargs): + buffer = stream.buffer + encoding = stream.encoding + super().__init__(buffer, *args, **kwargs, encoding=encoding) + self._lock = threading.Lock() + + def write(self, data): + with self._lock: + logs.append((datetime.now(), data)) + super().write(data) + + def flush(self): + super().flush() diff --git a/main.py b/main.py index 9bd985149..8c5d64bbe 100644 --- a/main.py +++ b/main.py @@ -1,13 +1,18 @@ import comfy.options comfy.options.enable_args_parsing() +# Intercept logs for error reporting +import sys +from app.log_interceptor import LogInterceptor +sys.stdout = LogInterceptor(sys.stdout) +sys.stderr = LogInterceptor(sys.stderr) + import os import importlib.util import folder_paths import time from comfy.cli_args import args - def execute_prestartup_script(): def execute_script(script_path): module_name = os.path.splitext(script_path)[0] diff --git a/server.py b/server.py index d8a9916bb..66c77b9c2 100644 --- a/server.py +++ b/server.py @@ -30,7 +30,7 @@ from app.user_manager import UserManager from model_filemanager import download_model, DownloadModelStatus from typing import Optional from api_server.routes.internal.internal_routes import InternalRoutes - +import torch class BinaryEventTypes: PREVIEW_IMAGE = 1 @@ -401,7 +401,7 @@ class PromptServer(): return web.json_response(dt["__metadata__"]) @routes.get("/system_stats") - async def get_queue(request): + async def system_stats(request): device = comfy.model_management.get_torch_device() device_name = comfy.model_management.get_torch_device_name(device) vram_total, torch_vram_total = comfy.model_management.get_total_memory(device, torch_total_too=True) @@ -410,7 +410,9 @@ class PromptServer(): "system": { "os": os.name, "python_version": sys.version, - "embedded_python": os.path.split(os.path.split(sys.executable)[0])[1] == "python_embeded" + "pytorch_version": torch.version.__version__, + "embedded_python": os.path.split(os.path.split(sys.executable)[0])[1] == "python_embeded", + "argv": sys.argv }, "devices": [ {