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:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user