Preserving logging streams through a daemon.DaemonContext switch

Rebelo puntabluda at gmail.com
Fri Apr 9 02:39:53 EDT 2010


Ben Finney wrote:
> Vinay Sajip <vinay_sajip at yahoo.co.uk> writes:
> 
>> On Apr 8, 1:58 pm, Rebelo <puntabl... at gmail.com> wrote:
>>> Vinay Sajip wrote:
>>>> My guess is - files_preserve needs to be passed a file handle and
>>>> not alogginghandler.
> 
> This is correct. As the ‘DaemonContext.__init__’ docstring says::
> 
>  |  `files_preserve`
>  |      :Default: ``None``
>  |  
>  |      List of files that should *not* be closed when starting the
>  |      daemon. If ``None``, all open file descriptors will be closed.
>  |  
>  |      Elements of the list are file descriptors (as returned by a file
>  |      object's `fileno()` method) or Python `file` objects. Each
>  |      specifies a file that is not to be closed during daemon start.
> 
>>> do you know where can i find good documnetation for python-daemon?
> 
> The docstrings and PEP 3143 are currently the best documentation for
> ‘python-daemon’; both describe the ‘files_preserve’ option as above.
> 
>> http://groups.google.com/group/comp.lang.python/msg/851ce78e53812ade
> 
> As expressed in the referenced message, I would welcome someone writing
> better documentation and contributing patches.
> 
>> It may lead you to more information. The thread shows that Sean
>> DiZazzo got logging working with the package.
> 
> It's important to note (as you did, thanks Vinay) that none of the
> ‘logging.handlers’ are file descriptors. Nor are they file objects.
> 
> If we can get a Python ‘file’ object, we can use its ‘fileno()’ method
> to get the file descriptor.
> 
> So how do we get the file object for a logging handler? The ‘logging’
> module documentation doesn't mention any way to get at the stream object
> for the handlers.
> 
> But looking at the source code for ‘StreamHandler’ on my system,
> ‘/usr/lib/python2.5/logging/__init__.py’, shows a ‘stream’ attribute
> that is bound to the stream object. It's not marked private (i.e. it's
> not named with a leading underscore), so one presumes it is part of the
> public API.
> 
>> I think you just have to pass the file object used by the handler
>> (fh.stream) in the files_preserve array.
> 
> Not quite. As the docs specify, you need to pass the *file descriptors*
> for the files you want preserved. For regular Python file objects, the
> ‘file.fileno()’ method returns the file descriptor:
> 
>     lh = logging.handlers.TimedRotatingFileHandler(
>         LOG_FILENAME,
>         # …
>         )
>     log_stream_descriptor = lh.stream.fileno()
> 
>     daemon_context.files_preserve = [log_stream_descriptor]
> 


thank you both for a detailed explanation.



More information about the Python-list mailing list