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