daemon.DaemonContext and logging
Ben Finney
ben+python at benfinney.id.au
Sat Apr 10 23:52:41 EDT 2010
Sean DiZazzo <half.italian at gmail.com> writes:
> I'm finally getting around to trying out the python-daemon module and
> have hit a wall. I'm trying to set up logging inside of the "with
> daemon.DaemonContext" block. But when I try to use a logger inside
> the block it throws an error:
Specifically, it's throwing an error because a logger set up *outside*
the context is no longer open *inside* the context.
[…]
> handler = logging.FileHandler("log.file")
> logger.addHandler(handler)
>
> pid = daemon.pidlockfile.TimeoutPIDLockFile("/var/run/daemontest.pid",
> 10)
>
> with daemon.DaemonContext(pidfile=pid, gid=0, uid=0,
> stdout=sys.stdout, stderr=sys.stderr):
> logger.info("POO")
Here, the daemon.DaemonContext has not been told to preserve the file
descriptor that was opened by ‘handler’; so that file descriptor gets
closed along with all the others when the DaemonContext opens.
Also, there's no point binding the ‘stdout’ and ‘stderr’ options to the
system streams as you've done: as the documentation specifies, becoming
a daemon process involves detaching from the controlling terminal, so
those streams will no longer be connected to anything.
If you want specific file descriptors to remain open, you need to tell
the DaemonContext which ones they are via the ‘files_preserve’ option:
#! /usr/bin/python
# -*- coding: utf-8; -*-
from __future__ import with_statement
import logging
import daemon
import daemon.pidlockfile
import sys
logger = logging.getLogger("DaemonLog")
logger.setLevel(logging.INFO)
formatter = logging.Formatter(
"%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler = logging.FileHandler("log.file")
logger.addHandler(handler)
pid = daemon.pidlockfile.TimeoutPIDLockFile(
"/tmp/dizazzo-daemontest.pid", 10)
daemon_context = daemon.DaemonContext(
pidfile=pid,
files_preserve=[handler.stream])
with daemon_context:
logger.info("POO")
Thanks for this question; it's now in the FAQ document for the next
version.
> Any advice? Also, I left in the call to TimeoutPIDLockfile() as well,
> because the library's documentation is pretty sparse, and I want to
> know if I'm using it properly.
Improvements to the documentation would be welcome, certainly.
--
\ “We now have access to so much information that we can find |
`\ support for any prejudice or opinion.” —David Suzuki, 2008-06-27 |
_o__) |
Ben Finney
More information about the Python-list
mailing list