126 lines
4.0 KiB
Python
126 lines
4.0 KiB
Python
"""Centralized logger configuration for vLLM-Omni ComfyUI."""
|
|
|
|
import logging
|
|
import pprint
|
|
import sys
|
|
from typing import Any
|
|
|
|
|
|
def get_logger(name: str) -> logging.Logger:
|
|
"""
|
|
Get or create a logger with proper formatting.
|
|
|
|
Args:
|
|
name: Logger name (typically __name__ of the calling module)
|
|
|
|
Returns:
|
|
Configured logger instance
|
|
"""
|
|
logger = logging.getLogger(name)
|
|
|
|
# Only configure if not already configured
|
|
if not logger.handlers:
|
|
logger.setLevel(logging.DEBUG)
|
|
|
|
# Create console handler
|
|
handler = logging.StreamHandler(sys.stdout)
|
|
handler.setLevel(logging.INFO)
|
|
|
|
# Create formatter
|
|
formatter = logging.Formatter(
|
|
fmt="(ComfyUI-vLLM-Omni) [%(levelname)s] %(asctime)s [%(filename)s:%(lineno)s] %(message)s",
|
|
datefmt="%Y-%m-%d %H:%M:%S",
|
|
)
|
|
handler.setFormatter(formatter)
|
|
|
|
# Add handler to logger
|
|
logger.addHandler(handler)
|
|
|
|
# Prevent propagation to root logger
|
|
logger.propagate = False
|
|
|
|
return logger
|
|
|
|
|
|
class OmitBase64PrettyPrinter(pprint.PrettyPrinter):
|
|
"""
|
|
A PrettyPrinter that redacts specific field names with '...'
|
|
wherever they appear in nested structures.
|
|
"""
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super().__init__(*args, **kwargs)
|
|
|
|
def _format(self, obj: Any, stream, indent: int, allowance: int, context, level: int) -> None:
|
|
# Check if this is a dict with redacted keys
|
|
if isinstance(obj, dict):
|
|
# Create a copy with redacted values
|
|
display_obj = {}
|
|
for key, value in obj.items():
|
|
if key == "data" or key == "url":
|
|
if value.startswith("data:"):
|
|
base64_header = value.split(",", 1)[0]
|
|
display_obj[key] = f"{base64_header},***"
|
|
elif value.startswith("http://") or value.startswith("https://"):
|
|
display_obj[key] = value
|
|
elif len(value) > 10:
|
|
display_obj[key] = f"{value[:10]}***"
|
|
else:
|
|
display_obj[key] = value
|
|
else:
|
|
display_obj[key] = value
|
|
obj = display_obj
|
|
|
|
# Handle list/tuple/set containing dicts that might have redacted keys
|
|
# (pprint will recursively call _format on nested items, so this
|
|
# handles arbitrary nesting automatically)
|
|
|
|
super()._format(obj, stream, indent, allowance, context, level)
|
|
|
|
|
|
pretty_printer = OmitBase64PrettyPrinter()
|
|
|
|
|
|
# ========== PPrint EXAMPLES ==========
|
|
|
|
if __name__ == "__main__":
|
|
data = {
|
|
"messages": [
|
|
{
|
|
"role": "system",
|
|
"content": (
|
|
"You are Qwen, a virtual human developed by the Qwen Team, Alibaba Group,"
|
|
"capable of perceiving auditory and visual inputs, as well as generating text and speech."
|
|
),
|
|
},
|
|
{
|
|
"role": "user",
|
|
"content": [
|
|
{
|
|
"type": "text",
|
|
"text": "What sound is it, and what is the drawing about?",
|
|
},
|
|
{
|
|
"type": "text",
|
|
"text": "What sound is it, and what is the drawing about?",
|
|
},
|
|
{
|
|
"type": "image_url",
|
|
"image_url": {"url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAwAAAA"},
|
|
},
|
|
{
|
|
"type": "audio_url",
|
|
"audio_url": {"url": "data:audio/mpeg;base64,SUQzBAAAAAAAIlRTU0UAAAAOAAADT="},
|
|
},
|
|
],
|
|
},
|
|
],
|
|
"extra_body": {"mm_processor_kwargs": {"use_audio_in_video": False}},
|
|
"modalities": ["text"],
|
|
}
|
|
|
|
# Create printer that redacts 'password' and 'token' fields
|
|
|
|
print("\nRedactingPrettyPrinter (hides secrets):")
|
|
pretty_printer.pprint(data)
|