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