[ZODB-Dev] Re: Can logreopen restarts Zope ?

Tres Seaver tseaver at palladion.com
Mon Jul 3 13:54:40 EDT 2006


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Julien Anguenot wrote:
> Hi,
>
> Gintautas Miliauskas wrote:
>>> I think the shift to the oh-so-much-better Python logging module is
>>> not complete.  See this bit in ZEO/runzeo.py:
>>>
>>>     def handle_sigusr2(self):
>>>         # TODO: this used to reinitialize zLOG. How do I achieve
>>>         # the same effect with Python's logging package?
>>>         # Should we restart as with SIGHUP?
>>>         log("received SIGUSR2, but it was not handled!", \
>>>              level=logging.WARNING)
>>>
>>> svn blames Tim for the comment, and Gintautas for the actual logging
>>> call change.
>> Ouch.  This migration took place such a long time ago that I barely
>> remember it, much less the details.  Apparently I did not know how to
>> fix this then, and I don't really know now either.
>>
>> From this document it appears that zlog.initialize() would call some
>> preset initializer function:
>> http://ingo.fargonauten.de/epydoc/private/zLOG-module.html
>>
>> That means that somewhere else set_initializer() must have been
>> called.  I found this by Fred Drake:
>>
>> http://aspn.activestate.com/ASPN/Mail/Message/zope-Checkins/1926169
>>
>> It looks like we should do some kind of a walk through all
>> StreamHandlers and try to reopen their streams if possible.  Do you
>> think this makes sense?
>>
>> Shane Hathaway says in
>> http://mail.python.org/pipermail/python-dev/2006-January/059578.html :
>>
>>> To be compatible with an external tool like logrotate, all a daemon
>>> needs to do is close and reopen log files at about the same time log
>>> rotation happens.  To handle this use case, I suggest the logging
>>> module needs a function named reopen(), which daemons can call upon
>>> receipt of a signal.  The reopen function will find all handlers with
>>> open files and ask them to reopen.
>> I take it that the logging module does not have such a function yet.
>>
>> Sorry for my refactoring causing problems.
>
> Thank you for the answer. For the moment, there is no hurry on my side
> as I got a workaround.
>
> We could probably open a ticket in the collector for this. Should I do
> it ?

Yes.  I think the code for the external handler would look something
like the following code::

  import logging

  def rotate_logging_handlers():
      """ Close and reopen all file-based handlers.
      """
      logging._acquireLock()
      try:
          for h in logging._handlers.keys():
              if isinstance(h, logging.FileHandler):
                  h.flush()
                  h.close()
                  h.strm = open(handler.baseFilename, h.mode))
      finally:
           logging._releaseLock()

This example is for the Python 2.3 version of the 'logging' module;  the
Python 2.4 version uses a list, '_handlersList', instead of the
'_handlers' dict.  See the 'shutdown' functions in each for how to
iterate over the list.


Tres.
- --
===================================================================
Tres Seaver          +1 202-558-7113          tseaver at palladion.com
Palladion Software   "Excellence by Design"    http://palladion.com
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2.2 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFEqVng+gerLs4ltQ4RAsVFAJ4oUGq2EMDn96mwYf8R28c5tWVIlACeKXQn
osn+DaaXtcKCN1iZPZlxHQk=
=gZUP
-----END PGP SIGNATURE-----



More information about the ZODB-Dev mailing list