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.
[worker]
user = haproxy
group = haproxy
driver = haproxy
reconnect_sleep = 60
server = 10.0.0.1:8080 10.0.0.2:8080

View File

@@ -13,7 +13,9 @@
import argparse
import logging
import logging.handlers
import os.path
import sys
import ConfigParser
@@ -132,6 +134,10 @@ class Options(object):
),
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(
'--user', dest='user',
help='user to use for daemon mode'
@@ -160,12 +166,28 @@ def setup_logging(name, args):
if args.nodaemon:
logfile = None
logging.basicConfig(
format='%(asctime)-6s: %(name)s - %(levelname)s - %(message)s',
filename=logfile
# Timestamped formatter
ts_formatter = logging.Formatter(
'%(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.addHandler(handler)
if args.debug:
logger.setLevel(level=logging.DEBUG)

View File

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

View File

@@ -109,14 +109,31 @@ class Server(object):
"""
def __init__(self, servers, reconnect_sleep):
self.logger = None
self.driver = None
self.servers = servers
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())
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)
worker = CustomJSONGearmanWorker(self.servers)
@@ -186,11 +203,10 @@ def main():
logger.debug("Job server list: %s" % args.server)
server = Server(args.server, args.reconnect_sleep)
server.logger = logger
server.driver = driver
if args.nodaemon:
server.main()
server.main(logger=logger)
else:
context = daemon.DaemonContext(
working_directory='/etc/haproxy',
@@ -211,6 +227,6 @@ def main():
return 1
with context:
server.main()
server.main(args)
return 0