1 """Support for setting the level of logging for components."""
3 from __future__
import annotations
8 import voluptuous
as vol
15 from .
import websocket_api
23 SERVICE_SET_DEFAULT_LEVEL,
26 from .helpers
import (
29 set_default_log_level,
33 _VALID_LOG_LEVEL = vol.All(vol.Upper, vol.In(LOGSEVERITY), LOGSEVERITY.__getitem__)
35 SERVICE_SET_DEFAULT_LEVEL_SCHEMA = vol.Schema({ATTR_LEVEL: _VALID_LOG_LEVEL})
36 SERVICE_SET_LEVEL_SCHEMA = vol.Schema({cv.string: _VALID_LOG_LEVEL})
38 CONFIG_SCHEMA = vol.Schema(
42 vol.Optional(LOGGER_DEFAULT): _VALID_LOG_LEVEL,
43 vol.Optional(LOGGER_LOGS): vol.Schema({cv.string: _VALID_LOG_LEVEL}),
44 vol.Optional(LOGGER_FILTERS): vol.Schema({cv.string: [cv.is_regex]}),
48 extra=vol.ALLOW_EXTRA,
52 async
def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
53 """Set up the logger component."""
60 websocket_api.async_load_websocket_api(hass)
62 await settings.async_load()
65 logger_config = config.get(DOMAIN, {})
67 if LOGGER_DEFAULT
in logger_config:
70 if LOGGER_FILTERS
in logger_config:
71 log_filters: dict[str, list[re.Pattern]] = logger_config[LOGGER_FILTERS]
72 for key, value
in log_filters.items():
76 combined_logs = await settings.async_get_levels(hass)
80 def async_service_handler(service: ServiceCall) ->
None:
81 """Handle logger services."""
82 if service.service == SERVICE_SET_DEFAULT_LEVEL:
87 hass.services.async_register(
89 SERVICE_SET_DEFAULT_LEVEL,
90 async_service_handler,
91 schema=SERVICE_SET_DEFAULT_LEVEL_SCHEMA,
94 hass.services.async_register(
97 async_service_handler,
98 schema=SERVICE_SET_LEVEL_SCHEMA,
105 """Add a Filter to the logger based on a regexp of the filter_str."""
107 def filter_func(logrecord: logging.LogRecord) -> bool:
108 return not any(p.search(logrecord.getMessage())
for p
in patterns)
110 logger.addFilter(filter_func)
114 """Create a logger subclass.
116 logging.setLoggerClass checks if it is a subclass of Logger and
117 so we cannot use partial to inject hass_overrides.
120 class HassLogger(logging.Logger):
121 """Home Assistant aware logger class."""
123 def setLevel(self, level: int | str) ->
None:
124 """Set the log level unless overridden."""
125 if self.name
in hass_overrides:
128 super().setLevel(level)
130 def orig_setLevel(self, level: int | str) ->
None:
131 """Set the log level."""
132 super().setLevel(level)
None set_log_levels(HomeAssistant hass, Mapping[str, int] logpoints)
None set_default_log_level(HomeAssistant hass, int level)
None _add_log_filter(logging.Logger logger, list[re.Pattern] patterns)
bool async_setup(HomeAssistant hass, ConfigType config)
type[logging.Logger] _get_logger_class(dict[str, int] hass_overrides)