diff --git a/ska_logging/configuration.py b/ska_logging/configuration.py index 22c6a2692a6287cdf66501e152b1963621b0b393..0df9690e31800cfa59727422c9a362898cfa33f0 100644 --- a/ska_logging/configuration.py +++ b/ska_logging/configuration.py @@ -38,6 +38,7 @@ _FORMAT_STR_WITH_TAGS = ( "%(message)s" ) +_FORMAT_STR_DATE = "%Y-%m-%dT%H:%M:%S" _LOGGING_CONFIG = { "version": 1, @@ -46,7 +47,7 @@ _LOGGING_CONFIG = { "default": { "()": _UTCFormatter, "format": _FORMAT_STR_NO_TAGS, - "datefmt": "%Y-%m-%dT%H:%M:%S", + "datefmt": _FORMAT_STR_DATE, } }, "handlers": { @@ -94,7 +95,7 @@ def configure_logging(level=None, tags_filter=None, overrides=None): """ config = copy.deepcopy(_LOGGING_CONFIG) if overrides: - config = _override(config, overrides) + config = _override(config, copy.deepcopy(overrides)) if level: config["root"]["level"] = level if tags_filter: @@ -128,7 +129,7 @@ def get_default_formatter(tags=False): format_str = _FORMAT_STR_WITH_TAGS else: format_str = _FORMAT_STR_NO_TAGS - return _UTCFormatter(fmt=format_str) + return _UTCFormatter(fmt=format_str, datefmt=_FORMAT_STR_DATE) def _override(config, overrides): diff --git a/tests/test_configuration.py b/tests/test_configuration.py index 885cc800ff4bc660f800c53563978961e47dbea2..6b1d558910e9cf6799d5eb05aa43770bd586d331 100644 --- a/tests/test_configuration.py +++ b/tests/test_configuration.py @@ -67,41 +67,44 @@ RECORDER_OVERRIDES = { } -@pytest.mark.usefixtures("reset_logging") -class TestConfigureLogging: - """Tests for :func:`~ska_logging.configuration.configure_logging`.""" +@pytest.fixture +def default_logger(): + """Return user logger instance with default configuration.""" + configure_logging() + yield logging.getLogger("ska.test.app") - @pytest.fixture - def default_logger(self): - """Return user logger instance with default configuration.""" - configure_logging() - yield logging.getLogger("ska.test.app") - @pytest.fixture - def recording_logger(self): - """Return user logger, including a recording handler. +@pytest.fixture +def recording_logger(): + """Return user logger, including a recording handler. + + The additional handler has the name "recorder". It uses the default formatter, + and stores all formatted output strings as a list in its `logs` attribute. + It also keeps a list of the raw log records in its `records` attribute. - The additional handler has the name "recorder". It uses the default formatter, - and stores all formatted output strings as a list in its `logs` attribute. - It also keeps a list of the raw log records in its `records` attribute. + Note: we use this instead of pytest's `caplog` fixture because we cannot change + the formatter that it uses. + """ + configure_logging(overrides=RECORDER_OVERRIDES) + yield logging.getLogger("ska.logger") - Note: we use this instead of pytest's `caplog` fixture because we cannot change - the formatter that it uses. - """ - configure_logging(overrides=RECORDER_OVERRIDES) - yield logging.getLogger("ska.logger") - @pytest.fixture - def recording_tags_logger(self): - """Return user logger like :func:`recording_logger`, but including tags filter.""" +@pytest.fixture +def recording_tags_logger(): + """Return user logger like :func:`recording_logger`, but including tags filter.""" - class MyFilter(logging.Filter): - def filter(self, record): - record.tags = "key1:value1,key2:value2" - return True + class MyFilter(logging.Filter): + def filter(self, record): + record.tags = "key1:value1,key2:value2" + return True - configure_logging(tags_filter=MyFilter, overrides=RECORDER_OVERRIDES) - yield logging.getLogger("ska.logger") + configure_logging(tags_filter=MyFilter, overrides=RECORDER_OVERRIDES) + yield logging.getLogger("ska.logger") + + +@pytest.mark.usefixtures("reset_logging") +class TestConfigureLogging: + """Tests for :func:`~ska_logging.configuration.configure_logging`.""" def test_includes_console_handler(self, default_logger): assert get_named_handler(default_logger, "console") @@ -165,23 +168,34 @@ class TestConfigureLogging: assert get_named_handler(logger, "test") +@pytest.mark.usefixtures("reset_logging") class TestGetDefaultFormatter: """Tests for :func:`~ska_logging.configuration.get_default_formatter`.""" - def test_default_no_tags(self): + def get_recorded_message(self, logger): + logger.info("test message") + recorder = get_named_handler(logger, "recorder") + record = recorder.records[0] + message = recorder.logs[0] + return record, message + + def test_default_no_tags(self, recording_logger): formatter = get_default_formatter() - assert isinstance(formatter, ska_logging.configuration._UTCFormatter) - assert formatter._fmt == ska_logging.configuration._FORMAT_STR_NO_TAGS + record, message = self.get_recorded_message(recording_logger) + actual_log_message = formatter.format(record) + assert actual_log_message == message - def test_get_tags_disabled(self): + def test_get_tags_disabled(self, recording_logger): formatter = get_default_formatter(tags=False) - assert isinstance(formatter, ska_logging.configuration._UTCFormatter) - assert formatter._fmt == ska_logging.configuration._FORMAT_STR_NO_TAGS + record, message = self.get_recorded_message(recording_logger) + actual_log_message = formatter.format(record) + assert actual_log_message == message - def test_get_tags_enabled(self): + def test_get_tags_enabled(self, recording_tags_logger): formatter = get_default_formatter(tags=True) - assert isinstance(formatter, ska_logging.configuration._UTCFormatter) - assert formatter._fmt == ska_logging.configuration._FORMAT_STR_WITH_TAGS + record, message = self.get_recorded_message(recording_tags_logger) + actual_log_message = formatter.format(record) + assert actual_log_message == message class TestOverride: