diff --git a/oslo_log/_options.py b/oslo_log/_options.py index d7459c70..e2162482 100644 --- a/oslo_log/_options.py +++ b/oslo_log/_options.py @@ -97,6 +97,10 @@ logging_cli_opts = [ default='LOG_USER', help='Syslog facility to receive log lines. ' + _IGNORE_MESSAGE), + cfg.BoolOpt('use-json', + default=False, + help='Use JSON formatting for logging. ' + + _IGNORE_MESSAGE), ] generic_log_opts = [ diff --git a/oslo_log/log.py b/oslo_log/log.py index 827a57d8..b39e8219 100644 --- a/oslo_log/log.py +++ b/oslo_log/log.py @@ -383,11 +383,15 @@ def _setup_logging_from_conf(conf, project, version): log_root.addHandler(syslog_handler) datefmt = conf.log_date_format - for handler in log_root.handlers: - handler.setFormatter(formatters.ContextFormatter(project=project, - version=version, - datefmt=datefmt, - config=conf)) + if not conf.use_json: + for handler in log_root.handlers: + handler.setFormatter(formatters.ContextFormatter(project=project, + version=version, + datefmt=datefmt, + config=conf)) + else: + for handler in log_root.handlers: + handler.setFormatter(formatters.JSONFormatter(datefmt=datefmt)) _refresh_root_level(conf.debug) for pair in conf.default_log_levels: diff --git a/oslo_log/tests/unit/test_log.py b/oslo_log/tests/unit/test_log.py index 1482de7f..6a256dae 100644 --- a/oslo_log/tests/unit/test_log.py +++ b/oslo_log/tests/unit/test_log.py @@ -1496,6 +1496,7 @@ class LogConfigOptsTestCase(BaseTestCase): self.CONF.log_date_format) self.assertEqual(False, self.CONF.use_syslog) + self.assertEqual(False, self.CONF.use_json) def test_log_file(self): log_file = '/some/path/foo-bar.log' @@ -1553,6 +1554,15 @@ class LogConfigOptsTestCase(BaseTestCase): self.assertIsInstance(formatter, formatters.ContextFormatter) + def test_json_formatter(self): + self.CONF(['--use-json']) + log._setup_logging_from_conf(self.CONF, 'test', 'test') + logger = log._loggers[None].logger + for handler in logger.handlers: + formatter = handler.formatter + self.assertIsInstance(formatter, + formatters.JSONFormatter) + def test_handlers_cleanup(self): """Test that all old handlers get removed from log_root.""" old_handlers = [log.handlers.ColorHandler(),