Logging fix and --syslog option.

Logging did not work when running as a daemon
because all open file handles were closed for
the fork. Since we cannot get to the file handle
using the 'logging' module, we'll just have to
re-init the logging after the daemon starts.

Added a --syslog option so that we can choose to
use syslog for capturing our logs. If present, it
takes precedence over any log file specified. The
timestamps are removed from the log message when
using syslog (it is assumed syslog will add the time).
This commit is contained in:
David Shrewsbury
2012-10-01 16:12:19 -04:00
parent 34ee842947
commit 0ad3586a31
4 changed files with 59 additions and 15 deletions

View File

@@ -24,6 +24,8 @@ verbose = true
# The [worker] section is specific to the libra_worker utility. # The [worker] section is specific to the libra_worker utility.
[worker] [worker]
user = haproxy
group = haproxy
driver = haproxy driver = haproxy
reconnect_sleep = 60 reconnect_sleep = 60
server = 10.0.0.1:8080 10.0.0.2:8080 server = 10.0.0.1:8080 10.0.0.2:8080

View File

@@ -13,7 +13,9 @@
import argparse import argparse
import logging import logging
import logging.handlers
import os.path import os.path
import sys
import ConfigParser import ConfigParser
@@ -132,6 +134,10 @@ class Options(object):
), ),
help='log file to use (ignored with --nodaemon)' help='log file to use (ignored with --nodaemon)'
) )
self.parser.add_argument(
'--syslog', dest='syslog', action='store_true',
help='use syslog for logging output'
)
self.parser.add_argument( self.parser.add_argument(
'--user', dest='user', '--user', dest='user',
help='user to use for daemon mode' help='user to use for daemon mode'
@@ -160,12 +166,28 @@ def setup_logging(name, args):
if args.nodaemon: if args.nodaemon:
logfile = None logfile = None
logging.basicConfig( # Timestamped formatter
format='%(asctime)-6s: %(name)s - %(levelname)s - %(message)s', ts_formatter = logging.Formatter(
filename=logfile '%(asctime)-6s: %(name)s - %(levelname)s - %(message)s'
) )
# No timestamp, used with syslog
simple_formatter = logging.Formatter(
'%(name)s - %(levelname)s - %(message)s'
)
if args.syslog:
handler = logging.handlers.SysLogHandler(facility="daemon")
handler.setFormatter(simple_formatter)
elif logfile:
handler = logging.FileHandler(logfile)
handler.setFormatter(ts_formatter)
else:
handler = logging.StreamHandler(sys.stdout)
handler.setFormatter(ts_formatter)
logger = logging.getLogger(name) logger = logging.getLogger(name)
logger.addHandler(handler)
if args.debug: if args.debug:
logger.setLevel(level=logging.DEBUG) logger.setLevel(level=logging.DEBUG)

View File

@@ -24,11 +24,15 @@ from libra.common.options import Options, setup_logging
class Server(object): class Server(object):
def __init__(self, logger, nodes): def __init__(self, nodes):
self.logger = logger
self.nodes = nodes self.nodes = nodes
def main(self): def main(self, logger=None, args=None):
if logger:
self.logger = logger
else:
self.logger = setup_logging('libra_mgm', args)
self.logger.info( self.logger.info(
'Libra Pool Manager started with a float of {nodes} nodes' 'Libra Pool Manager started with a float of {nodes} nodes'
.format(nodes=self.nodes) .format(nodes=self.nodes)
@@ -53,17 +57,17 @@ class Server(object):
def main(): def main():
options = Options('mgm', 'Node Management Daemon') options = Options('mgm', 'Node Management Daemon')
options.parser_add_argument( options.parser.add_argument(
'--nodes', type=int, default=1, '--nodes', type=int, default=1,
help='number of nodes' help='number of nodes'
) )
args = options.run() args = options.run()
logger = setup_logging('libra_mgm', args) logger = setup_logging('libra_mgm', args)
server = Server(logger, args.nodes) server = Server(args.nodes)
if args.nodaemon: if args.nodaemon:
server.main() server.main(logger=logger)
else: else:
context = daemon.DaemonContext( context = daemon.DaemonContext(
working_directory='/etc/haproxy', working_directory='/etc/haproxy',
@@ -83,6 +87,6 @@ def main():
logger.critical("Invalid group: %s" % args.group) logger.critical("Invalid group: %s" % args.group)
return 1 return 1
with context: with context:
server.main() server.main(args)
return 0 return 0

View File

@@ -109,14 +109,31 @@ class Server(object):
""" """
def __init__(self, servers, reconnect_sleep): def __init__(self, servers, reconnect_sleep):
self.logger = None
self.driver = None self.driver = None
self.servers = servers self.servers = servers
self.reconnect_sleep = reconnect_sleep self.reconnect_sleep = reconnect_sleep
def main(self): def main(self, logger=None, args=None):
"""
Main method of the server.
`logger`
If given, will be used as the logging class. Otherwise, a new
logger will be retrieved.
`args`
Only needed when `logger` is None.
"""
my_ip = socket.gethostbyname(socket.gethostname()) my_ip = socket.gethostbyname(socket.gethostname())
task_name = "lbaas-%s" % my_ip task_name = "lbaas-%s" % my_ip
if logger:
self.logger = logger
else:
# We need to setup logging here because if we are running
# as a daemon, then any open file handles will have been closed.
self.logger = setup_logging('libra_worker', args)
self.logger.debug("Registering task %s" % task_name) self.logger.debug("Registering task %s" % task_name)
worker = CustomJSONGearmanWorker(self.servers) worker = CustomJSONGearmanWorker(self.servers)
@@ -186,11 +203,10 @@ def main():
logger.debug("Job server list: %s" % args.server) logger.debug("Job server list: %s" % args.server)
server = Server(args.server, args.reconnect_sleep) server = Server(args.server, args.reconnect_sleep)
server.logger = logger
server.driver = driver server.driver = driver
if args.nodaemon: if args.nodaemon:
server.main() server.main(logger=logger)
else: else:
context = daemon.DaemonContext( context = daemon.DaemonContext(
working_directory='/etc/haproxy', working_directory='/etc/haproxy',
@@ -211,6 +227,6 @@ def main():
return 1 return 1
with context: with context:
server.main() server.main(args)
return 0 return 0