summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Sulfrian <alexander.sulfrian@fu-berlin.de>2015-07-28 20:30:21 +0200
committerAlexander Sulfrian <alexander.sulfrian@fu-berlin.de>2015-07-28 20:30:21 +0200
commitec4ce72b1d319b83c0fdd3273989055acee36ad5 (patch)
tree7928f010705de56db6fe5ed300c686897a64bb60
parent175db54cd37c7df5bfac9bfee1ee237c126582b9 (diff)
downloadbcfg2-ec4ce72b1d319b83c0fdd3273989055acee36ad5.tar.gz
bcfg2-ec4ce72b1d319b83c0fdd3273989055acee36ad5.tar.bz2
bcfg2-ec4ce72b1d319b83c0fdd3273989055acee36ad5.zip
BuiltinCore: Fix logging with daemonization
python-daemon closes all open files, so we need to specify the filehandles of the log files to keep logging working.
-rw-r--r--src/lib/Bcfg2/Server/BuiltinCore.py21
1 files changed, 20 insertions, 1 deletions
diff --git a/src/lib/Bcfg2/Server/BuiltinCore.py b/src/lib/Bcfg2/Server/BuiltinCore.py
index e138c57e4..dc5cc46fb 100644
--- a/src/lib/Bcfg2/Server/BuiltinCore.py
+++ b/src/lib/Bcfg2/Server/BuiltinCore.py
@@ -34,7 +34,8 @@ class BuiltinCore(NetworkCore):
daemon_args = dict(uid=Bcfg2.Options.setup.daemon_uid,
gid=Bcfg2.Options.setup.daemon_gid,
umask=int(Bcfg2.Options.setup.umask, 8),
- detach_process=True)
+ detach_process=True,
+ files_preserve=self._logfilehandles())
if Bcfg2.Options.setup.daemon:
daemon_args['pidfile'] = TimeoutPIDLockFile(
Bcfg2.Options.setup.daemon, acquire_timeout=5)
@@ -44,6 +45,24 @@ class BuiltinCore(NetworkCore):
self.context = daemon.DaemonContext(**daemon_args)
__init__.__doc__ = NetworkCore.__init__.__doc__.split('.. -----')[0]
+ def _logfilehandles(self, logger=None):
+ """ Get a list of all filehandles logger, that have to be handled
+ with DaemonContext.files_preserve to keep looging working.
+
+ :param logger: The logger to get the file handles of. By default,
+ self.logger is used.
+ :type logger: logging.Logger
+ """
+ if logger is None:
+ logger = self.logger
+
+ handles = [handler.stream.fileno()
+ for handler in logger.handlers
+ if hasattr(handler, 'stream')]
+ if logger.parent:
+ handles += self._logfilehandles(logger.parent)
+ return handles
+
def _dispatch(self, method, args, dispatch_dict):
""" Dispatch XML-RPC method calls