From fe018fd58c4037cdeb87bcce939edd5891680135 Mon Sep 17 00:00:00 2001 From: Dale Higgs Date: Thu, 7 Jun 2018 16:03:04 -0500 Subject: [PATCH] Add set_default_level to logger (#14703) * Add set_default_service to logger * Fix 2-line lint error * Add set_default_level to services.yaml * Add tests for set_default_level * Remove function and add else when setting default --- homeassistant/components/logger.py | 28 +++++++++++++++++++------- homeassistant/components/services.yaml | 6 ++++++ tests/components/test_logger.py | 27 +++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 7 deletions(-) diff --git a/homeassistant/components/logger.py b/homeassistant/components/logger.py index 6e8995a0444..daaffd0174c 100644 --- a/homeassistant/components/logger.py +++ b/homeassistant/components/logger.py @@ -15,6 +15,7 @@ DOMAIN = 'logger' DATA_LOGGER = 'logger' +SERVICE_SET_DEFAULT_LEVEL = 'set_default_level' SERVICE_SET_LEVEL = 'set_level' LOGSEVERITY = { @@ -31,8 +32,11 @@ LOGSEVERITY = { LOGGER_DEFAULT = 'default' LOGGER_LOGS = 'logs' +ATTR_LEVEL = 'level' + _VALID_LOG_LEVEL = vol.All(vol.Upper, vol.In(LOGSEVERITY)) +SERVICE_SET_DEFAULT_LEVEL_SCHEMA = vol.Schema({ATTR_LEVEL: _VALID_LOG_LEVEL}) SERVICE_SET_LEVEL_SCHEMA = vol.Schema({cv.string: _VALID_LOG_LEVEL}) CONFIG_SCHEMA = vol.Schema({ @@ -76,12 +80,9 @@ async def async_setup(hass, config): """Set up the logger component.""" logfilter = {} - # 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] - ] + def set_default_log_level(level): + """Set the default log level for components.""" + logfilter[LOGGER_DEFAULT] = LOGSEVERITY[level] def set_log_levels(logpoints): """Set the specified log levels.""" @@ -103,6 +104,12 @@ async def async_setup(hass, config): ) ) + # Set default log severity + if LOGGER_DEFAULT in config.get(DOMAIN): + set_default_log_level(config.get(DOMAIN)[LOGGER_DEFAULT]) + else: + set_default_log_level('DEBUG') + logger = logging.getLogger('') logger.setLevel(logging.NOTSET) @@ -116,7 +123,14 @@ async def async_setup(hass, config): async def async_service_handler(service): """Handle logger services.""" - set_log_levels(service.data) + if service.service == SERVICE_SET_DEFAULT_LEVEL: + set_default_log_level(service.data.get(ATTR_LEVEL)) + else: + set_log_levels(service.data) + + hass.services.async_register( + DOMAIN, SERVICE_SET_DEFAULT_LEVEL, async_service_handler, + schema=SERVICE_SET_DEFAULT_LEVEL_SCHEMA) hass.services.async_register( DOMAIN, SERVICE_SET_LEVEL, async_service_handler, diff --git a/homeassistant/components/services.yaml b/homeassistant/components/services.yaml index c0279ef1d0f..19bf19a799a 100644 --- a/homeassistant/components/services.yaml +++ b/homeassistant/components/services.yaml @@ -175,6 +175,12 @@ ffmpeg: example: 'binary_sensor.ffmpeg_noise' logger: + set_default_level: + description: Set the default log level for components. + fields: + level: + description: Default severity level. Possible values are notset, debug, info, warn, warning, error, fatal, critical + example: 'debug' set_level: description: Set log level for components. diff --git a/tests/components/test_logger.py b/tests/components/test_logger.py index 61cb42e8bb5..a55a66c6505 100644 --- a/tests/components/test_logger.py +++ b/tests/components/test_logger.py @@ -10,6 +10,7 @@ from tests.common import get_test_home_assistant RECORD = namedtuple('record', ('name', 'levelno')) +NO_DEFAULT_CONFIG = {'logger': {}} NO_LOGS_CONFIG = {'logger': {'default': 'info'}} TEST_CONFIG = { 'logger': { @@ -99,3 +100,29 @@ class TestUpdater(unittest.TestCase): self.assert_logged('asdf', logging.DEBUG) self.assert_logged('dummy', logging.WARNING) + + def test_set_default_filter_empty_config(self): + """Test change default log level from empty configuration.""" + self.setup_logger(NO_DEFAULT_CONFIG) + + self.assert_logged('test', logging.DEBUG) + + self.hass.services.call( + logger.DOMAIN, 'set_default_level', {'level': 'warning'}) + self.hass.block_till_done() + + self.assert_not_logged('test', logging.DEBUG) + + def test_set_default_filter(self): + """Test change default log level with existing default.""" + self.setup_logger(TEST_CONFIG) + + self.assert_not_logged('asdf', logging.DEBUG) + self.assert_logged('dummy', logging.WARNING) + + self.hass.services.call( + logger.DOMAIN, 'set_default_level', {'level': 'debug'}) + self.hass.block_till_done() + + self.assert_logged('asdf', logging.DEBUG) + self.assert_logged('dummy', logging.WARNING)