From c0a9859afb522d555a9b9851be48be56327d252d Mon Sep 17 00:00:00 2001
From: "Miss Islington (bot)"
 <31488909+miss-islington@users.noreply.github.com>
Date: Sat, 27 Aug 2022 07:10:17 -0700
Subject: [PATCH] [3.10] gh-89047: Fix msecs computation so you never end up
 with 1000 msecs. (GH-96340) (GH-96342)

---
 Lib/logging/__init__.py  | 2 +-
 Lib/test/test_logging.py | 8 ++++++++
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py
index 19bd2bc20b2..09810bdf0d0 100644
--- a/Lib/logging/__init__.py
+++ b/Lib/logging/__init__.py
@@ -325,7 +325,7 @@ def __init__(self, name, level, pathname, lineno,
         self.lineno = lineno
         self.funcName = func
         self.created = ct
-        self.msecs = (ct - int(ct)) * 1000
+        self.msecs = int((ct - int(ct)) * 1000) + 0.0  # see gh-89047
         self.relativeCreated = (self.created - _startTime) * 1000
         if logThreads:
             self.thread = threading.get_ident()
diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py
index af68f258204..920bbeb6600 100644
--- a/Lib/test/test_logging.py
+++ b/Lib/test/test_logging.py
@@ -4020,6 +4020,14 @@ class NoMsecFormatter(logging.Formatter):
         f.converter = time.gmtime
         self.assertEqual(f.formatTime(r), '21/04/1993 08:03:00')
 
+    def test_issue_89047(self):
+        f = logging.Formatter(fmt='{asctime}.{msecs:03.0f} {message}', style='{', datefmt="%Y-%m-%d %H:%M:%S")
+        for i in range(2500):
+            time.sleep(0.0004)
+            r = logging.makeLogRecord({'msg': 'Message %d' % (i + 1)})
+            s = f.format(r)
+            self.assertNotIn('.1000', s)
+
 
 class TestBufferingFormatter(logging.BufferingFormatter):
     def formatHeader(self, records):
-- 
GitLab