Move ZHA debug logs handling out of event loop (#138568)

This commit is contained in:
Abílio Costa 2025-02-17 16:12:55 +00:00 committed by GitHub
parent 67fcbc4c28
commit 25296e1b8f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -11,6 +11,7 @@ import enum
import functools
import itertools
import logging
import queue
import re
import time
from types import MappingProxyType
@ -111,9 +112,10 @@ from homeassistant.helpers import (
device_registry as dr,
entity_registry as er,
)
from homeassistant.helpers.dispatcher import async_dispatcher_send
from homeassistant.helpers.dispatcher import async_dispatcher_send, dispatcher_send
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import ConfigType
from homeassistant.util.logging import HomeAssistantQueueHandler
from .const import (
ATTR_ACTIVE_COORDINATOR,
@ -505,7 +507,14 @@ class ZHAGatewayProxy(EventBase):
DEBUG_LEVEL_CURRENT: async_capture_log_levels(),
}
self.debug_enabled: bool = False
self._log_relay_handler: LogRelayHandler = LogRelayHandler(hass, self)
log_relay_handler: LogRelayHandler = LogRelayHandler(hass, self)
log_simple_queue: queue.SimpleQueue[logging.Handler] = queue.SimpleQueue()
self._log_queue_handler = HomeAssistantQueueHandler(log_simple_queue)
self._log_queue_handler.listener = logging.handlers.QueueListener(
log_simple_queue, log_relay_handler
)
self._unsubs: list[Callable[[], None]] = []
self._unsubs.append(self.gateway.on_all_events(self._handle_event_protocol))
self._reload_task: asyncio.Task | None = None
@ -736,10 +745,13 @@ class ZHAGatewayProxy(EventBase):
self._log_levels[DEBUG_LEVEL_CURRENT] = async_capture_log_levels()
if filterer:
self._log_relay_handler.addFilter(filterer)
self._log_queue_handler.addFilter(filterer)
if self._log_queue_handler.listener:
self._log_queue_handler.listener.start()
for logger_name in DEBUG_RELAY_LOGGERS:
logging.getLogger(logger_name).addHandler(self._log_relay_handler)
logging.getLogger(logger_name).addHandler(self._log_queue_handler)
self.debug_enabled = True
@ -749,9 +761,14 @@ class ZHAGatewayProxy(EventBase):
async_set_logger_levels(self._log_levels[DEBUG_LEVEL_ORIGINAL])
self._log_levels[DEBUG_LEVEL_CURRENT] = async_capture_log_levels()
for logger_name in DEBUG_RELAY_LOGGERS:
logging.getLogger(logger_name).removeHandler(self._log_relay_handler)
logging.getLogger(logger_name).removeHandler(self._log_queue_handler)
if self._log_queue_handler.listener:
self._log_queue_handler.listener.stop()
if filterer:
self._log_relay_handler.removeFilter(filterer)
self._log_queue_handler.removeFilter(filterer)
self.debug_enabled = False
async def shutdown(self) -> None:
@ -978,7 +995,7 @@ class LogRelayHandler(logging.Handler):
entry = LogEntry(
record, self.paths_re, figure_out_source=record.levelno >= logging.WARNING
)
async_dispatcher_send(
dispatcher_send(
self.hass,
ZHA_GW_MSG,
{ATTR_TYPE: ZHA_GW_MSG_LOG_OUTPUT, ZHA_GW_MSG_LOG_ENTRY: entry.to_dict()},