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