From 2e2502affe50831a0f7288fa40527f31b2bfad28 Mon Sep 17 00:00:00 2001 From: Talmaj Marinc Date: Thu, 21 May 2026 21:57:01 +0200 Subject: [PATCH] Add colored logs option. --- app/logger.py | 26 +++++++++++++++++++++++--- comfy/cli_args.py | 1 + main.py | 2 +- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/app/logger.py b/app/logger.py index 3d26d98fe..4be4ac8de 100644 --- a/app/logger.py +++ b/app/logger.py @@ -5,6 +5,24 @@ import logging import sys import threading +ANSI_LEVEL_COLORS = { + 'DEBUG': '\033[36m', # cyan + 'INFO': '\033[32m', # green + 'WARNING': '\033[33m', # yellow + 'ERROR': '\033[31m', # red + 'CRITICAL': '\033[35m', # magenta +} +ANSI_RESET = '\033[0m' +ANSI_BOLD = '\033[1m' + + +class ColoredFormatter(logging.Formatter): + def format(self, record): + color = ANSI_LEVEL_COLORS.get(record.levelname, '') + bold = ANSI_BOLD if record.levelno >= logging.WARNING else '' + level_tag = f"{bold}{color}[{record.levelname}]{ANSI_RESET} " + return level_tag + super().format(record) + logs = None stdout_interceptor = None stderr_interceptor = None @@ -51,7 +69,7 @@ def on_flush(callback): if stderr_interceptor is not None: stderr_interceptor.on_flush(callback) -def setup_logger(log_level: str = 'INFO', capacity: int = 300, use_stdout: bool = False): +def setup_logger(log_level: str = 'INFO', capacity: int = 300, use_stdout: bool = False, color_logs: bool = False): global logs if logs: return @@ -68,8 +86,10 @@ def setup_logger(log_level: str = 'INFO', capacity: int = 300, use_stdout: bool logger = logging.getLogger() logger.setLevel(log_level) + formatter = ColoredFormatter("%(message)s") if color_logs else logging.Formatter("%(message)s") + stream_handler = logging.StreamHandler() - stream_handler.setFormatter(logging.Formatter("%(message)s")) + stream_handler.setFormatter(formatter) if use_stdout: # Only errors and critical to stderr @@ -77,7 +97,7 @@ def setup_logger(log_level: str = 'INFO', capacity: int = 300, use_stdout: bool # Lesser to stdout stdout_handler = logging.StreamHandler(sys.stdout) - stdout_handler.setFormatter(logging.Formatter("%(message)s")) + stdout_handler.setFormatter(formatter) stdout_handler.addFilter(lambda record: record.levelno < logging.ERROR) logger.addHandler(stdout_handler) diff --git a/comfy/cli_args.py b/comfy/cli_args.py index 9d88c8517..95b2e14d2 100644 --- a/comfy/cli_args.py +++ b/comfy/cli_args.py @@ -183,6 +183,7 @@ parser.add_argument("--multi-user", action="store_true", help="Enables per-user parser.add_argument("--verbose", default='INFO', const='DEBUG', nargs="?", choices=['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'], help='Set the logging level') parser.add_argument("--log-stdout", action="store_true", help="Send normal process output to stdout instead of stderr (default).") +parser.add_argument("--color-logs", action="store_true", help="Enable ANSI colored log output in the terminal.") # The default built-in provider hosted under web/ diff --git a/main.py b/main.py index 1e47cab84..15a6460b2 100644 --- a/main.py +++ b/main.py @@ -17,7 +17,7 @@ import folder_paths import time from comfy.cli_args import enables_dynamic_vram from app.logger import setup_logger -setup_logger(log_level=args.verbose, use_stdout=args.log_stdout) +setup_logger(log_level=args.verbose, use_stdout=args.log_stdout, color_logs=args.color_logs) from app.assets.seeder import asset_seeder from app.assets.services import register_output_files