Skip to content

Commit c3a8846

Browse files
authored
Merge pull request #812 from hathawsh/master
Fixed logfile output to special files like /dev/stdout on Python 3.
2 parents 91d909c + 388c325 commit c3a8846

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

supervisor/loggers.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,9 +138,22 @@ class FileHandler(Handler):
138138
"""File handler which supports reopening of logs.
139139
"""
140140

141-
def __init__(self, filename, mode="a"):
141+
def __init__(self, filename, mode='a'):
142142
Handler.__init__(self)
143-
self.stream = open(filename, mode)
143+
144+
try:
145+
self.stream = open(filename, mode)
146+
except OSError as e:
147+
if mode == 'a' and e.errno == errno.ESPIPE:
148+
# Python 3 can't open special files like
149+
# /dev/stdout in 'a' mode due to an implicit seek call
150+
# that fails with ESPIPE. Retry in 'w' mode.
151+
# See: http://bugs.python.org/issue27805
152+
mode = 'w'
153+
self.stream = open(filename, mode)
154+
else:
155+
raise
156+
144157
self.baseFilename = filename
145158
self.mode = mode
146159

supervisor/tests/test_loggers.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,22 @@ def test_emit_error(self):
220220
self.assertTrue(dummy_stderr.written.endswith('OSError\n'),
221221
dummy_stderr.written)
222222

223+
if os.path.exists('/dev/stdout'):
224+
StdoutTestsBase = FileHandlerTests
225+
else:
226+
# Skip the stdout tests on platforms that don't have /dev/stdout.
227+
StdoutTestsBase = object
228+
229+
class StdoutTests(StdoutTestsBase):
230+
def test_ctor_with_dev_stdout(self):
231+
handler = self._makeOne('/dev/stdout')
232+
# Modes 'w' and 'a' have the same semantics when applied to
233+
# character device files and fifos.
234+
self.assertTrue(handler.mode in ['w', 'a'], handler.mode)
235+
self.assertEqual(handler.baseFilename, '/dev/stdout')
236+
self.assertEqual(handler.stream.name, '/dev/stdout')
237+
handler.close()
238+
223239
class RotatingFileHandlerTests(FileHandlerTests):
224240

225241
def _getTargetClass(self):

0 commit comments

Comments
 (0)