[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