Improve logging shutdown (#85812)

* Improve logging shutdown

* Update test
This commit is contained in:
Erik Montnemery 2023-01-17 20:06:25 +01:00 committed by GitHub
parent f6cd399b9e
commit f93bbd55ba
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 20 additions and 19 deletions

View file

@ -11,7 +11,6 @@ import queue
import traceback
from typing import Any, TypeVar, cast, overload
from homeassistant.const import EVENT_HOMEASSISTANT_CLOSE
from homeassistant.core import HomeAssistant, callback, is_callback
_T = TypeVar("_T")
@ -35,6 +34,8 @@ class HideSensitiveDataFilter(logging.Filter):
class HomeAssistantQueueHandler(logging.handlers.QueueHandler):
"""Process the log in another thread."""
listener: logging.handlers.QueueListener | None = None
def prepare(self, record: logging.LogRecord) -> logging.LogRecord:
"""Prepare a record for queuing.
@ -62,6 +63,18 @@ class HomeAssistantQueueHandler(logging.handlers.QueueHandler):
self.emit(record)
return return_value
def close(self) -> None:
"""
Tidy up any resources used by the handler.
This adds shutdown of the QueueListener
"""
super().close()
if not self.listener:
return
self.listener.stop()
self.listener = None
@callback
def async_activate_log_queue_handler(hass: HomeAssistant) -> None:
@ -83,20 +96,10 @@ def async_activate_log_queue_handler(hass: HomeAssistant) -> None:
migrated_handlers.append(handler)
listener = logging.handlers.QueueListener(simple_queue, *migrated_handlers)
queue_handler.listener = listener
listener.start()
@callback
def _async_stop_queue_handler(_: Any) -> None:
"""Cleanup handler."""
# Ensure any messages that happen after close still get logged
for original_handler in migrated_handlers:
logging.root.addHandler(original_handler)
logging.root.removeHandler(queue_handler)
listener.stop()
hass.bus.async_listen_once(EVENT_HOMEASSISTANT_CLOSE, _async_stop_queue_handler)
def log_exception(format_err: Callable[..., Any], *args: Any) -> None:
"""Log an exception with additional context."""