From 79ba7b3e2ea6e2dc2e720c2cae1e6ae0aeeea392 Mon Sep 17 00:00:00 2001 From: Aravinda VK Date: Thu, 19 Sep 2013 14:24:35 +0530 Subject: geo-rep: logrotate: Logrotate handling In existing georep logrotate was implemented by handling SIGSTOP and SIGCONT, gsyncd was failing to start again after SIGSTOP. New approach uses WatchedFileHandler in logging, which tracks the log file changes or logrotate. Reopens the log file if logrotate is triggered or if same log file is updated from other process. As per python doc: http://docs.python.org/2/library/logging.handlers.html: The WatchedFileHandler class, located in the logging.handlers module, is a FileHandler which watches the file it is logging to. If the file changes, it is closed and reopened using the file name. A file change can happen because of usage of programs such as newsyslog and logrotate which perform log file rotation. This handler, intended for use under Unix/Linux, watches the file to see if it has changed since the last emit. (A file is deemed to have changed if its device or inode have changed.) If the file has changed, the old file stream is closed, and the file opened to get a new stream. Change-Id: I30f65eb1e9778b12943d6e43b60a50344a7885c6 BUG: 1012776 Signed-off-by: Aravinda VK Reviewed-on: http://review.gluster.org/5968 Reviewed-by: Amar Tumballi Reviewed-by: Harshavardhana Tested-by: Gluster Build System Reviewed-by: Anand Avati --- geo-replication/syncdaemon/gsyncd.py | 21 +++++++++++++++++++-- geo-replication/syncdaemon/monitor.py | 13 ------------- 2 files changed, 19 insertions(+), 15 deletions(-) (limited to 'geo-replication') diff --git a/geo-replication/syncdaemon/gsyncd.py b/geo-replication/syncdaemon/gsyncd.py index b460c6c6dbc..7fcc3165ac9 100644 --- a/geo-replication/syncdaemon/gsyncd.py +++ b/geo-replication/syncdaemon/gsyncd.py @@ -12,7 +12,7 @@ import optparse import fcntl import fnmatch from optparse import OptionParser, SUPPRESS_HELP -from logging import Logger +from logging import Logger, handlers from errno import EEXIST, ENOENT from ipaddr import IPAddress, IPNetwork @@ -58,7 +58,24 @@ class GLogger(Logger): logging.root = cls("root", lvl) logging.setLoggerClass(cls) logging.getLogger().handlers = [] - logging.basicConfig(**lprm) + logging.getLogger().setLevel(lprm['level']) + + if 'filename' in lprm: + try: + logging_handler = handlers.WatchedFileHandler(lprm['filename']) + formatter = logging.Formatter(fmt=lprm['format'], + datefmt=lprm['datefmt']) + logging_handler.setFormatter(formatter) + logging.getLogger().addHandler(logging_handler) + except AttributeError: + # Python version < 2.6 will not have WatchedFileHandler + # so fallback to logging without any handler. + # Note: logrotate will not work if Python version is < 2.6 + logging.basicConfig(**lprm) + else: + # If filename not passed(not available in lprm) then it may be + # streaming.(Ex: {"stream": "/dev/stdout"}) + logging.basicConfig(**lprm) @classmethod def _gsyncd_loginit(cls, **kw): diff --git a/geo-replication/syncdaemon/monitor.py b/geo-replication/syncdaemon/monitor.py index f6c79753d35..0c3a42fa6b7 100644 --- a/geo-replication/syncdaemon/monitor.py +++ b/geo-replication/syncdaemon/monitor.py @@ -176,19 +176,6 @@ class Monitor(object): return ret def multiplex(self, wspx, suuid): - def sigcont_handler(*a): - """ - Re-init logging and send group kill signal - """ - md = gconf.log_metadata - logging.shutdown() - lcls = logging.getLoggerClass() - lcls.setup(label=md.get('saved_label'), **md) - pid = os.getpid() - os.kill(-pid, signal.SIGUSR1) - signal.signal(signal.SIGUSR1, lambda *a: ()) - signal.signal(signal.SIGCONT, sigcont_handler) - argv = sys.argv[:] for o in ('-N', '--no-daemon', '--monitor'): while o in argv: -- cgit