Allow stream log level to change at runtime (#66153)

This commit is contained in:
uvjustin 2022-02-22 00:58:15 +08:00 committed by GitHub
parent a4ba511276
commit 4efada7db0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 48 additions and 5 deletions

View File

@ -120,10 +120,8 @@ CONFIG_SCHEMA = vol.Schema(
def filter_libav_logging() -> None:
"""Filter libav logging to only log when the stream logger is at DEBUG."""
stream_debug_enabled = logging.getLogger(__name__).isEnabledFor(logging.DEBUG)
def libav_filter(record: logging.LogRecord) -> bool:
return stream_debug_enabled
return logging.getLogger(__name__).isEnabledFor(logging.DEBUG)
for logging_namespace in (
"libav.mp4",

View File

@ -6,6 +6,5 @@
"dependencies": ["http"],
"codeowners": ["@hunterjm", "@uvjustin", "@allenporter"],
"quality_scale": "internal",
"iot_class": "local_push",
"loggers": ["av"]
"iot_class": "local_push"
}

View File

@ -0,0 +1,46 @@
"""Test stream init."""
import logging
import av
from homeassistant.components.stream import __name__ as stream_name
from homeassistant.setup import async_setup_component
async def test_log_levels(hass, caplog):
"""Test that the worker logs the url without username and password."""
logging.getLogger(stream_name).setLevel(logging.INFO)
await async_setup_component(hass, "stream", {"stream": {}})
# These namespaces should only pass log messages when the stream logger
# is at logging.DEBUG or below
namespaces_to_toggle = (
"mp4",
"h264",
"hevc",
"rtsp",
"tcp",
"tls",
"mpegts",
"NULL",
)
# Since logging is at INFO, these should not pass
for namespace in namespaces_to_toggle:
av.logging.log(av.logging.ERROR, namespace, "SHOULD NOT PASS")
logging.getLogger(stream_name).setLevel(logging.DEBUG)
# Since logging is now at DEBUG, these should now pass
for namespace in namespaces_to_toggle:
av.logging.log(av.logging.ERROR, namespace, "SHOULD PASS")
# Even though logging is at DEBUG, these should not pass
av.logging.log(av.logging.WARNING, "mp4", "SHOULD NOT PASS")
av.logging.log(av.logging.WARNING, "swscaler", "SHOULD NOT PASS")
assert "SHOULD PASS" in caplog.text
assert "SHOULD NOT PASS" not in caplog.text