diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst index e943011c8afd84..7267f812cc1925 100644 --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -608,6 +608,9 @@ The useful mapping keys in a :class:`LogRecord` are given in the section on attributes are ``default_time_format`` (for the strptime format string) and ``default_msec_format`` (for appending the millisecond value). + .. versionchanged:: 3.9 + The ``default_msec_format`` can be ``None``. + .. method:: formatException(exc_info) Formats the specified exception information (a standard exception tuple as diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index 84a177559908a2..403dc81b13ef4e 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -597,8 +597,9 @@ def formatTime(self, record, datefmt=None): if datefmt: s = time.strftime(datefmt, ct) else: - t = time.strftime(self.default_time_format, ct) - s = self.default_msec_format % (t, record.msecs) + s = time.strftime(self.default_time_format, ct) + if self.default_msec_format: + s = self.default_msec_format % (s, record.msecs) return s def formatException(self, ei): diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py index 2ad3c5c2085839..99e74ebff60875 100644 --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -3941,6 +3941,19 @@ def test_time(self): f.format(r) self.assertEqual(r.asctime, '1993-04-21 08:03:00,123') + def test_default_msec_format_none(self): + class NoMsecFormatter(logging.Formatter): + default_msec_format = None + default_time_format = '%d/%m/%Y %H:%M:%S' + + r = self.get_record() + dt = datetime.datetime(1993, 4, 21, 8, 3, 0, 123, utc) + r.created = time.mktime(dt.astimezone(None).timetuple()) + f = NoMsecFormatter() + f.converter = time.gmtime + self.assertEqual(f.formatTime(r), '21/04/1993 08:03:00') + + class TestBufferingFormatter(logging.BufferingFormatter): def formatHeader(self, records): return '[(%d)' % len(records)