Skip to content

Commit e91662e

Browse files
Get logs endpoint & system_stats additions (Comfy-Org#4690)
* Add route for getting output logs * Include ComfyUI version * Move to own function * Changed to memory logger * Unify logger setup logic * Fix get version git fallback --------- Co-authored-by: pythongosssss <125205205+pythongosssss@users.noreply.github.com>
1 parent 63fafae commit e91662e

5 files changed

Lines changed: 61 additions & 10 deletions

File tree

api_server/routes/internal/internal_routes.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from typing import Optional
33
from folder_paths import models_dir, user_directory, output_directory
44
from api_server.services.file_service import FileService
5+
import app.logger
56

67
class InternalRoutes:
78
'''
@@ -31,6 +32,9 @@ async def list_files(request):
3132
except Exception as e:
3233
return web.json_response({"error": str(e)}, status=500)
3334

35+
@self.routes.get('/logs')
36+
async def get_logs(request):
37+
return web.json_response(app.logger.get_logs())
3438

3539
def get_app(self):
3640
if self._app is None:

app/logger.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import logging
2+
from logging.handlers import MemoryHandler
3+
from collections import deque
4+
5+
logs = None
6+
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
7+
8+
9+
def get_logs():
10+
return "\n".join([formatter.format(x) for x in logs])
11+
12+
13+
def setup_logger(verbose: bool = False, capacity: int = 300):
14+
global logs
15+
if logs:
16+
return
17+
18+
# Setup default global logger
19+
logger = logging.getLogger()
20+
logger.setLevel(logging.DEBUG if verbose else logging.INFO)
21+
22+
stream_handler = logging.StreamHandler()
23+
stream_handler.setFormatter(logging.Formatter("%(message)s"))
24+
logger.addHandler(stream_handler)
25+
26+
# Create a memory handler with a deque as its buffer
27+
logs = deque(maxlen=capacity)
28+
memory_handler = MemoryHandler(capacity, flushLevel=logging.INFO)
29+
memory_handler.buffer = logs
30+
memory_handler.setFormatter(formatter)
31+
logger.addHandler(memory_handler)

comfy/cli_args.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -179,10 +179,3 @@ def is_valid_directory(path: Optional[str]) -> Optional[str]:
179179

180180
if args.disable_auto_launch:
181181
args.auto_launch = False
182-
183-
import logging
184-
logging_level = logging.INFO
185-
if args.verbose:
186-
logging_level = logging.DEBUG
187-
188-
logging.basicConfig(format="%(message)s", level=logging_level)

main.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
import folder_paths
77
import time
88
from comfy.cli_args import args
9+
from app.logger import setup_logger
10+
11+
12+
setup_logger(verbose=args.verbose)
913

1014

1115
def execute_prestartup_script():

server.py

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
from model_filemanager import download_model, DownloadModelStatus
3131
from typing import Optional
3232
from api_server.routes.internal.internal_routes import InternalRoutes
33-
33+
import torch
3434

3535
class BinaryEventTypes:
3636
PREVIEW_IMAGE = 1
@@ -42,6 +42,21 @@ async def send_socket_catch_exception(function, message):
4242
except (aiohttp.ClientError, aiohttp.ClientPayloadError, ConnectionResetError) as err:
4343
logging.warning("send error: {}".format(err))
4444

45+
def get_comfyui_version():
46+
comfyui_version = "unknown"
47+
repo_path = os.path.dirname(os.path.realpath(__file__))
48+
try:
49+
import pygit2
50+
repo = pygit2.Repository(repo_path)
51+
comfyui_version = repo.describe(describe_strategy=pygit2.GIT_DESCRIBE_TAGS)
52+
except Exception:
53+
try:
54+
import subprocess
55+
comfyui_version = subprocess.check_output(["git", "describe", "--tags"], cwd=repo_path)
56+
except Exception as e:
57+
logging.warning(f"Failed to get ComfyUI version: {e}")
58+
return comfyui_version.strip()
59+
4560
@web.middleware
4661
async def cache_control(request: web.Request, handler):
4762
response: web.Response = await handler(request)
@@ -401,16 +416,20 @@ async def view_metadata(request):
401416
return web.json_response(dt["__metadata__"])
402417

403418
@routes.get("/system_stats")
404-
async def get_queue(request):
419+
async def system_stats(request):
405420
device = comfy.model_management.get_torch_device()
406421
device_name = comfy.model_management.get_torch_device_name(device)
407422
vram_total, torch_vram_total = comfy.model_management.get_total_memory(device, torch_total_too=True)
408423
vram_free, torch_vram_free = comfy.model_management.get_free_memory(device, torch_free_too=True)
424+
409425
system_stats = {
410426
"system": {
411427
"os": os.name,
428+
"comfyui_version": get_comfyui_version(),
412429
"python_version": sys.version,
413-
"embedded_python": os.path.split(os.path.split(sys.executable)[0])[1] == "python_embeded"
430+
"pytorch_version": torch.version.__version__,
431+
"embedded_python": os.path.split(os.path.split(sys.executable)[0])[1] == "python_embeded",
432+
"argv": sys.argv
414433
},
415434
"devices": [
416435
{

0 commit comments

Comments
 (0)