diff --git a/homeassistant/components/logger.py b/homeassistant/components/logger.py new file mode 100644 index 00000000000..019102fa6f4 --- /dev/null +++ b/homeassistant/components/logger.py @@ -0,0 +1,94 @@ +""" +homeassistant.components.logger +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Component that will help guide the user taking its first steps. + +For more details about this component, please refer to the documentation at +https://home-assistant.io/components/logger.html + +Sample configuration + +logger: + default: critical + logs: + homeassistant.components: debug + homeassistant.components.device_tracker: critical + homeassistant.components.camera: critical + +""" +import logging +from collections import OrderedDict + +DOMAIN = 'logger' +DEPENDENCIES = [] + +LOGSEVERITY = { + 'CRITICAL': 50, + 'FATAL': 50, + 'ERROR': 40, + 'WARNING': 30, + 'WARN': 30, + 'INFO': 20, + 'DEBUG': 10, + 'NOTSET': 0 +} + +LOGGER_DEFAULT = 'default' +LOGGER_LOGS = 'logs' + + +class HomeAssistantLogFilter(logging.Filter): + """A Home Assistant log filter""" + # pylint: disable=no-init,too-few-public-methods + + def __init__(self, logfilter): + super().__init__() + + self.logfilter = logfilter + + def filter(self, record): + + # Log with filterd severity + if LOGGER_LOGS in self.logfilter: + for filtername in self.logfilter[LOGGER_LOGS]: + logseverity = self.logfilter[LOGGER_LOGS][filtername] + if record.name.startswith(filtername): + return record.levelno >= logseverity + + # Log with default severity + default = self.logfilter[LOGGER_DEFAULT] + return record.levelno >= default + + +def setup(hass, config=None): + """ Setup the logger component. """ + + logfilter = dict() + + # Set default log severity + logfilter[LOGGER_DEFAULT] = LOGSEVERITY['DEBUG'] + if LOGGER_DEFAULT in config.get(DOMAIN): + logfilter[LOGGER_DEFAULT] = LOGSEVERITY[ + config.get(DOMAIN)[LOGGER_DEFAULT].upper() + ] + + # Compute logseverity for components + if LOGGER_LOGS in config.get(DOMAIN): + for key, value in config.get(DOMAIN)[LOGGER_LOGS].items(): + config.get(DOMAIN)[LOGGER_LOGS][key] = LOGSEVERITY[value.upper()] + + logs = OrderedDict( + sorted( + config.get(DOMAIN)[LOGGER_LOGS].items(), + key=lambda t: len(t[0]), + reverse=True + ) + ) + + logfilter[LOGGER_LOGS] = logs + + # Set log filter for all log handler + for handler in logging.root.handlers: + handler.addFilter(HomeAssistantLogFilter(logfilter)) + + return True diff --git a/homeassistant/loader.py b/homeassistant/loader.py index 7b755214252..b05083b4abd 100644 --- a/homeassistant/loader.py +++ b/homeassistant/loader.py @@ -167,7 +167,7 @@ def load_order_components(components): load_order.update(comp_load_order) # Push some to first place in load order - for comp in ('recorder', 'introduction'): + for comp in ('logger', 'recorder', 'introduction'): if comp in load_order: load_order.promote(comp)