New submission from STINNER Victor <victor.stin...@haypocalc.com>:

My server is running as root and is writing logs into /var/log/nucentral.log. I 
tried to run it under a different user ("nucentral"), and I changed 
/var/log/nucentral.log file permissions.

I'm using:
   MAX_LOG_FILESIZE = 5 * 1024 * 1024
   MAX_LOG_FILES = 10   # including .log, so last file prefix is .log.9

   handler = RotatingFileHandler('/var/log/nucentral.log', 'a',
      maxBytes=MAX_LOG_FILESIZE, backupCount=(MAX_LOG_FILES - 1),
      encoding='utf8')

The problems start at the next rollover: the user is not allowed to write into 
/var/log, and so rename /var/log/nucentral.log to /var/log/nucentral.log.1 (and 
/var/log/nucentral.log.2 to /var/log/nucentral.log.3) fails. We have here a new 
problem: doRollover() starts by closing the log file and then rename files. If 
rename fails, the stream is closed and no new stream is opened. But my server 
catchs any exception and write them into /var/log/nucentral.log. The rename 
exception will be written... in the log file, but writing in a closed file 
raise a new exception! The log system is completly broken and go into an evil 
recursion loop :-)

I can fix my code responsible to log any exception to avoid the recursion, and 
avoid the directory permission by writing into /var/log/nucentral/. But there 
is still the problem of closing the stream before renaming the log files.

I propose to close the stream *after* renaming old log files. Attached patch 
closes the stream just before reopening it. It works correctly on Linux.

I don't know if it's possible on Windows to rename a file which is currently 
open :-/ Anyway, the goal is to ensure that the stream is open when exiting the 
doRollover() function. Another idea would be to use the following pattern:
  stream.close()
  try:
     ...
  except:
     self.stream = self._open()
     raise
  else:
     self._mode = 'w'
     self.stream = self._open()

----------
components: Library (Lib)
files: logging_rotate.patch
keywords: patch
messages: 100252
nosy: haypo
severity: normal
status: open
title: logging: Improve error handing in RotatingFileHandler.doRollover()
versions: Python 2.7, Python 3.2, Python 3.3
Added file: http://bugs.python.org/file16406/logging_rotate.patch

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue8034>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to