From c52c982510fc7f32b5e216068c729960ab890759 Mon Sep 17 00:00:00 2001 From: badele Date: Wed, 4 Nov 2015 21:30:02 +0100 Subject: [PATCH 1/4] Add logger feature --- homeassistant/components/logger.py | 84 ++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 homeassistant/components/logger.py diff --git a/homeassistant/components/logger.py b/homeassistant/components/logger.py new file mode 100644 index 00000000000..2c48b59442e --- /dev/null +++ b/homeassistant/components/logger.py @@ -0,0 +1,84 @@ +""" +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 + +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): + def __init__(self, logfilter): + self.logfilter = logfilter + + def filter(self, record): + + # Log with filterd severity + if LOGGER_LOGS in self.logfilter: + for keyvalue in self.logfilter[LOGGER_LOGS]: + filtername = keyvalue[0] + logseverity = keyvalue[1] + 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. """ + + root_logger = logging.getLogger() + + loggerconfig = config.get(DOMAIN) + logfilter = dict() + + # Set default log severity + logfilter[LOGGER_DEFAULT] = LOGSEVERITY['debug'.upper()] + if LOGGER_DEFAULT in loggerconfig: + logfilter[LOGGER_DEFAULT] = LOGSEVERITY[loggerconfig[LOGGER_DEFAULT].upper()] + + # Compute logseverity for components + if LOGGER_LOGS in loggerconfig: + for key, value in loggerconfig[LOGGER_LOGS].items(): + loggerconfig[LOGGER_LOGS][key] = LOGSEVERITY[value.upper()] + + logs = sorted(loggerconfig[LOGGER_LOGS].items(), key=lambda t: 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)) + root_logger.info(logfilter) + + return True From a31f7d2816903aef055fd5018a56d9ddbdfc6054 Mon Sep 17 00:00:00 2001 From: badele Date: Wed, 4 Nov 2015 22:08:15 +0100 Subject: [PATCH 2/4] Fix flake & pylint --- homeassistant/components/logger.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/logger.py b/homeassistant/components/logger.py index 2c48b59442e..f05aee16ee2 100644 --- a/homeassistant/components/logger.py +++ b/homeassistant/components/logger.py @@ -37,7 +37,12 @@ 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): @@ -66,14 +71,20 @@ def setup(hass, config=None): # Set default log severity logfilter[LOGGER_DEFAULT] = LOGSEVERITY['debug'.upper()] if LOGGER_DEFAULT in loggerconfig: - logfilter[LOGGER_DEFAULT] = LOGSEVERITY[loggerconfig[LOGGER_DEFAULT].upper()] + logfilter[LOGGER_DEFAULT] = LOGSEVERITY[ + loggerconfig[LOGGER_DEFAULT].upper() + ] # Compute logseverity for components if LOGGER_LOGS in loggerconfig: for key, value in loggerconfig[LOGGER_LOGS].items(): loggerconfig[LOGGER_LOGS][key] = LOGSEVERITY[value.upper()] - logs = sorted(loggerconfig[LOGGER_LOGS].items(), key=lambda t: t[0], reverse=True) + logs = sorted( + loggerconfig[LOGGER_LOGS].items(), + key=lambda t: t[0], + reverse=True + ) logfilter[LOGGER_LOGS] = logs # Set log filter for all log handler From aeacbad4a00be6f3f6e48571fa03d8fdf8a07967 Mon Sep 17 00:00:00 2001 From: badele Date: Fri, 6 Nov 2015 22:51:33 +0100 Subject: [PATCH 3/4] Fix pull request from balloob comments --- homeassistant/components/logger.py | 33 +++++++++++++++--------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/homeassistant/components/logger.py b/homeassistant/components/logger.py index f05aee16ee2..019102fa6f4 100644 --- a/homeassistant/components/logger.py +++ b/homeassistant/components/logger.py @@ -17,6 +17,7 @@ logger: """ import logging +from collections import OrderedDict DOMAIN = 'logger' DEPENDENCIES = [] @@ -49,9 +50,8 @@ class HomeAssistantLogFilter(logging.Filter): # Log with filterd severity if LOGGER_LOGS in self.logfilter: - for keyvalue in self.logfilter[LOGGER_LOGS]: - filtername = keyvalue[0] - logseverity = keyvalue[1] + for filtername in self.logfilter[LOGGER_LOGS]: + logseverity = self.logfilter[LOGGER_LOGS][filtername] if record.name.startswith(filtername): return record.levelno >= logseverity @@ -63,33 +63,32 @@ class HomeAssistantLogFilter(logging.Filter): def setup(hass, config=None): """ Setup the logger component. """ - root_logger = logging.getLogger() - - loggerconfig = config.get(DOMAIN) logfilter = dict() # Set default log severity - logfilter[LOGGER_DEFAULT] = LOGSEVERITY['debug'.upper()] - if LOGGER_DEFAULT in loggerconfig: + logfilter[LOGGER_DEFAULT] = LOGSEVERITY['DEBUG'] + if LOGGER_DEFAULT in config.get(DOMAIN): logfilter[LOGGER_DEFAULT] = LOGSEVERITY[ - loggerconfig[LOGGER_DEFAULT].upper() + config.get(DOMAIN)[LOGGER_DEFAULT].upper() ] # Compute logseverity for components - if LOGGER_LOGS in loggerconfig: - for key, value in loggerconfig[LOGGER_LOGS].items(): - loggerconfig[LOGGER_LOGS][key] = LOGSEVERITY[value.upper()] + 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 = sorted( - loggerconfig[LOGGER_LOGS].items(), - key=lambda t: t[0], - reverse=True + 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)) - root_logger.info(logfilter) return True From 6f06f48ac6a358abfc0689f1c005e7b4644039f5 Mon Sep 17 00:00:00 2001 From: badele Date: Fri, 6 Nov 2015 22:57:03 +0100 Subject: [PATCH 4/4] Ensure the component is loaded first --- homeassistant/loader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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)