165 lines
No EOL
5.9 KiB
Python
165 lines
No EOL
5.9 KiB
Python
"""
|
|
WebSocket debugging utilities.
|
|
|
|
This module provides utilities for configuring WebSocket logging and debugging
|
|
based on configuration settings.
|
|
"""
|
|
import logging
|
|
import sys
|
|
from typing import Optional
|
|
from pathlib import Path
|
|
|
|
from ..core.config import get_config_manager
|
|
|
|
|
|
def setup_websocket_logging(
|
|
enable_debug: Optional[bool] = None,
|
|
rxtx_log_level: Optional[str] = None,
|
|
message_proc_log_level: Optional[str] = None,
|
|
log_file: Optional[str] = None
|
|
) -> None:
|
|
"""
|
|
Set up WebSocket logging based on configuration.
|
|
|
|
Args:
|
|
enable_debug: Enable WebSocket debugging (overrides config)
|
|
rxtx_log_level: Log level for RX/TX messages (overrides config)
|
|
message_proc_log_level: Log level for message processing (overrides config)
|
|
log_file: Optional log file path for WebSocket messages
|
|
"""
|
|
# Get configuration
|
|
config_manager = get_config_manager()
|
|
logging_config = config_manager.get_logging_config()
|
|
|
|
# Use provided values or fall back to config
|
|
debug_enabled = enable_debug if enable_debug is not None else logging_config.websocket_debug
|
|
rxtx_level = rxtx_log_level or logging_config.websocket_rxtx_log_level
|
|
msg_proc_level = message_proc_log_level or logging_config.websocket_message_proc_log_level
|
|
|
|
# Configure WebSocket RX/TX logger
|
|
ws_rxtx_logger = logging.getLogger("websocket.rxtx")
|
|
ws_rxtx_logger.setLevel(getattr(logging, rxtx_level.upper(), logging.INFO))
|
|
|
|
# Configure WebSocket message processor logger
|
|
ws_msg_proc_logger = logging.getLogger("websocket.message_processor")
|
|
ws_msg_proc_logger.setLevel(getattr(logging, msg_proc_level.upper(), logging.DEBUG))
|
|
|
|
# Configure main WebSocket logger
|
|
ws_logger = logging.getLogger("websocket")
|
|
ws_logger.setLevel(logging.DEBUG if debug_enabled else logging.INFO)
|
|
|
|
# Set up console handler for debugging if not already present
|
|
if debug_enabled and not ws_rxtx_logger.handlers:
|
|
# Create console handler
|
|
console_handler = logging.StreamHandler(sys.stdout)
|
|
console_handler.setLevel(getattr(logging, rxtx_level.upper(), logging.INFO))
|
|
|
|
# Create formatter for WebSocket messages
|
|
formatter = logging.Formatter(
|
|
"%(asctime)s | WEBSOCKET | %(name)s | %(message)s",
|
|
datefmt="%Y-%m-%d %H:%M:%S"
|
|
)
|
|
console_handler.setFormatter(formatter)
|
|
|
|
# Add handler to both WebSocket loggers
|
|
ws_rxtx_logger.addHandler(console_handler)
|
|
ws_msg_proc_logger.addHandler(console_handler)
|
|
|
|
# Set up file handler if log file is specified
|
|
if log_file:
|
|
log_path = Path(log_file)
|
|
log_path.parent.mkdir(parents=True, exist_ok=True)
|
|
|
|
# Create file handler
|
|
file_handler = logging.FileHandler(log_path)
|
|
file_handler.setLevel(logging.DEBUG)
|
|
|
|
# Create detailed formatter for file output
|
|
file_formatter = logging.Formatter(
|
|
"%(asctime)s | %(levelname)s | %(name)s | %(message)s"
|
|
)
|
|
file_handler.setFormatter(file_formatter)
|
|
|
|
# Add to all WebSocket loggers
|
|
ws_rxtx_logger.addHandler(file_handler)
|
|
ws_msg_proc_logger.addHandler(file_handler)
|
|
ws_logger.addHandler(file_handler)
|
|
|
|
# Log configuration status
|
|
main_logger = logging.getLogger("detector_worker.websocket_debug")
|
|
main_logger.info(f"WebSocket debugging configured: "
|
|
f"enabled={debug_enabled}, "
|
|
f"rxtx_level={rxtx_level}, "
|
|
f"msg_proc_level={msg_proc_level}, "
|
|
f"log_file={log_file}")
|
|
|
|
|
|
def enable_websocket_debug() -> None:
|
|
"""Enable WebSocket debugging with default settings."""
|
|
setup_websocket_logging(
|
|
enable_debug=True,
|
|
rxtx_log_level="INFO",
|
|
message_proc_log_level="DEBUG"
|
|
)
|
|
|
|
|
|
def disable_websocket_debug() -> None:
|
|
"""Disable WebSocket debugging."""
|
|
# Set all WebSocket loggers to WARNING level to reduce noise
|
|
ws_loggers = [
|
|
"websocket",
|
|
"websocket.rxtx",
|
|
"websocket.message_processor"
|
|
]
|
|
|
|
for logger_name in ws_loggers:
|
|
logger = logging.getLogger(logger_name)
|
|
logger.setLevel(logging.WARNING)
|
|
|
|
# Remove all handlers
|
|
for handler in logger.handlers[:]:
|
|
logger.removeHandler(handler)
|
|
|
|
|
|
def get_websocket_debug_status() -> dict:
|
|
"""
|
|
Get current WebSocket debugging status.
|
|
|
|
Returns:
|
|
Dictionary with debugging status information
|
|
"""
|
|
config_manager = get_config_manager()
|
|
logging_config = config_manager.get_logging_config()
|
|
|
|
# Check current logger levels
|
|
ws_rxtx_logger = logging.getLogger("websocket.rxtx")
|
|
ws_msg_proc_logger = logging.getLogger("websocket.message_processor")
|
|
ws_logger = logging.getLogger("websocket")
|
|
|
|
return {
|
|
"config": {
|
|
"websocket_debug": logging_config.websocket_debug,
|
|
"websocket_rxtx_log_level": logging_config.websocket_rxtx_log_level,
|
|
"websocket_message_proc_log_level": logging_config.websocket_message_proc_log_level
|
|
},
|
|
"runtime": {
|
|
"websocket_logger_level": logging.getLevelName(ws_logger.level),
|
|
"rxtx_logger_level": logging.getLevelName(ws_rxtx_logger.level),
|
|
"msg_proc_logger_level": logging.getLevelName(ws_msg_proc_logger.level),
|
|
"handler_count": {
|
|
"websocket": len(ws_logger.handlers),
|
|
"rxtx": len(ws_rxtx_logger.handlers),
|
|
"msg_proc": len(ws_msg_proc_logger.handlers)
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
def log_websocket_stats() -> None:
|
|
"""Log WebSocket communication statistics."""
|
|
logger = logging.getLogger("websocket.stats")
|
|
|
|
# This could be extended to track actual message counts
|
|
# For now, just log the current status
|
|
status = get_websocket_debug_status()
|
|
logger.info(f"WebSocket Debug Status: {status}") |