https://github.com/python/cpython/commit/aa8a43d179bad5cd9fbfce63b630e2ee0bd617e4
commit: aa8a43d179bad5cd9fbfce63b630e2ee0bd617e4
branch: main
author: Serhiy Storchaka <[email protected]>
committer: serhiy-storchaka <[email protected]>
date: 2025-12-30T14:56:29Z
summary:
gh-143237: Fix support of named pipes in the rotating logging handlers
(GH-143259)
This fixes regression introduced in GH-105887.
files:
A Misc/NEWS.d/next/Library/2025-12-28-20-28-05.gh-issue-143237.q1ymuA.rst
M Lib/logging/handlers.py
M Lib/test/test_logging.py
diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py
index 2748b5941eade2..4a07258f8d6d07 100644
--- a/Lib/logging/handlers.py
+++ b/Lib/logging/handlers.py
@@ -196,7 +196,11 @@ def shouldRollover(self, record):
if self.stream is None: # delay was set...
self.stream = self._open()
if self.maxBytes > 0: # are we rolling over?
- pos = self.stream.tell()
+ try:
+ pos = self.stream.tell()
+ except io.UnsupportedOperation:
+ # gh-143237: Never rollover a named pipe.
+ return False
if not pos:
# gh-116263: Never rollover an empty file
return False
diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py
index 8815426fc99c39..848084e6e36878 100644
--- a/Lib/test/test_logging.py
+++ b/Lib/test/test_logging.py
@@ -25,6 +25,7 @@
import codecs
import configparser
+import contextlib
import copy
import datetime
import pathlib
@@ -6369,6 +6370,32 @@ def test_should_not_rollover_non_file(self):
self.assertFalse(rh.shouldRollover(self.next_rec()))
rh.close()
+ @unittest.skipUnless(hasattr(os, "mkfifo"), 'requires os.mkfifo()')
+ def test_should_not_rollover_named_pipe(self):
+ # gh-143237 - test with non-seekable special file (named pipe)
+ filename = os_helper.TESTFN
+ self.addCleanup(os_helper.unlink, filename)
+ try:
+ os.mkfifo(filename)
+ except PermissionError as e:
+ self.skipTest('os.mkfifo(): %s' % e)
+
+ data = 'not read'
+ def other_side():
+ nonlocal data
+ with open(filename, 'rb') as f:
+ data = f.read()
+
+ thread = threading.Thread(target=other_side)
+ with threading_helper.start_threads([thread]):
+ rh = logging.handlers.RotatingFileHandler(
+ filename, encoding="utf-8", maxBytes=1)
+ with contextlib.closing(rh):
+ m = self.next_rec()
+ self.assertFalse(rh.shouldRollover(m))
+ rh.emit(m)
+ self.assertEqual(data.decode(), m.msg + os.linesep)
+
def test_should_rollover(self):
with open(self.fn, 'wb') as f:
f.write(b'\n')
diff --git
a/Misc/NEWS.d/next/Library/2025-12-28-20-28-05.gh-issue-143237.q1ymuA.rst
b/Misc/NEWS.d/next/Library/2025-12-28-20-28-05.gh-issue-143237.q1ymuA.rst
new file mode 100644
index 00000000000000..131bebcd984ac2
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-12-28-20-28-05.gh-issue-143237.q1ymuA.rst
@@ -0,0 +1 @@
+Fix support of named pipes in the rotating :mod:`logging` handlers.
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]