Preserving logging streams through a daemon.DaemonContext switch

Rebelo puntabluda at
Fri Apr 9 08:39:53 CEST 2010

Ben Finney wrote:
> Vinay Sajip <vinay_sajip at> writes:
>> On Apr 8, 1:58 pm, Rebelo <puntabl... at> 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.
> 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/’, 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
>> ( 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 =
>     daemon_context.files_preserve = [log_stream_descriptor]

thank you both for a detailed explanation.

More information about the Python-list mailing list