From 744b65fdc26b0f49792ee65ed8ccd1738eea0044 Mon Sep 17 00:00:00 2001 From: Sidnei da Silva Date: Wed, 21 Dec 2005 12:29:35 +0000 Subject: [PATCH] - Collector #1939: When running as a service, Zope could potentially collect too much log output filling the NT Event Log. When that happened, a 'print' during exception handling would cause an IOError in the restart code causing the service not to restart automatically. Problem is that a service/pythonw.exe process *always* has an invalid sys.stdout. But due to the magic of buffering, small print statements would not fail - but once the file actually got written to, the error happened. Never a problem when debugging, as the process has a console, and hence a valid stdout. --- service.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/service.py b/service.py index 481fb2a..d000988 100644 --- a/service.py +++ b/service.py @@ -36,8 +36,10 @@ # (except obviously via the event log entry) # Size of the blocks we read from the child process's output. CHILDCAPTURE_BLOCK_SIZE = 80 -# The number of BLOCKSIZE blocks we keep as process output. -CHILDCAPTURE_MAX_BLOCKS = 200 +# The number of BLOCKSIZE blocks we keep as process output. This gives +# is 4k, which should be enough to see any tracebacks etc, but not so +# large as to prematurely fill the event log. +CHILDCAPTURE_MAX_BLOCKS = 50 class Service(win32serviceutil.ServiceFramework): """Base class for a Windows Server to manage an external process. @@ -108,7 +110,10 @@ def logmsg(self, event): except win32api.error, details: # Failed to write a log entry - most likely problem is # that the event log is full. We don't want this to kill us - print "FAILED to write INFO event", event, ":", details + try: + print "FAILED to write INFO event", event, ":", details + except IOError: + pass def _dolog(self, func, msg): try: @@ -118,8 +123,13 @@ def _dolog(self, func, msg): except win32api.error, details: # Failed to write a log entry - most likely problem is # that the event log is full. We don't want this to kill us - print "FAILED to write event log entry:", details - print msg + try: + print "FAILED to write event log entry:", details + print msg + except IOError: + # And if running as a service, its likely our sys.stdout + # is invalid + pass def info(self, s): self._dolog(servicemanager.LogInfoMsg, s)