commit 6ec37f0cd673964101a430dbb8b3da5d4a18b6ee
Author: Ondrej Lichtner <olichtne(a)redhat.com>
Date: Tue Sep 9 15:59:22 2014 +0200
logs: add netns information to logs
All log messages now contain information about what network namespace
they've originated in. Since xml result files are generated
automatically, the information about the network namespace is already
present in them.
Signed-off-by: Ondrej Lichtner <olichtne(a)redhat.com>
Signed-off-by: Jiri Pirko <jiri(a)resnulli.us>
lnst/Common/LoggingHandler.py | 6 ++++++
lnst/Common/Logs.py | 28 ++++++++++++++++++++++------
lnst/Common/NetTestCommand.py | 22 +++++++++++++++++++---
lnst/Slave/NetTestSlave.py | 1 +
4 files changed, 48 insertions(+), 9 deletions(-)
---
diff --git a/lnst/Common/LoggingHandler.py b/lnst/Common/LoggingHandler.py
index 3fd8919..22d58f5 100644
--- a/lnst/Common/LoggingHandler.py
+++ b/lnst/Common/LoggingHandler.py
@@ -66,12 +66,18 @@ class TransmitHandler(logging.Handler):
def __init__(self, target):
logging.Handler.__init__(self)
self.target = target
+ self._origin_name = None
+
+ def set_origin_name(self, name):
+ self._origin_name = name
def emit(self, record):
r = dict(record.__dict__)
r['msg'] = record.getMessage()
r['args'] = None
r['exc_info'] = None
+ if self._origin_name != None:
+ r['origin_name'] = self._origin_name
data = {"type": "log", "record": r}
diff --git a/lnst/Common/Logs.py b/lnst/Common/Logs.py
index b891439..89118c1 100644
--- a/lnst/Common/Logs.py
+++ b/lnst/Common/Logs.py
@@ -24,11 +24,12 @@ def log_exc_traceback():
class MultilineFormatter(Formatter): # addr:17 level:7
_ADDR_WIDTH = 17
+ _NETNS_WIDTH = 8
_LEVEL_WIDTH = 7
_coloured = False
def __init__(self, coloured=False):
- fmt = "%(asctime)s %(address)s %(levelname)s: %(message)s"
+ fmt = "%(asctime)s %(address)s %(netns)s %(levelname)s: %(message)s"
datefmt = "%Y-%m-%d %H:%M:%S"
self.linefmt = " "
self._coloured = coloured
@@ -44,12 +45,12 @@ class MultilineFormatter(Formatter): # addr:17 level:7
def _format_addr(self, record):
if not "address" in record.__dict__:
- addr = "(localhost)".rjust(17)
+ addr = "(localhost)"
else:
- addr = record.address.rjust(17)
+ addr = "(" + record.address + ")"
- just = " " * (self._ADDR_WIDTH - len(addr))
- return just + self._decorate_value(addr, "log_header")
+ addr = addr.rjust(self._ADDR_WIDTH)
+ return self._decorate_value(addr, "log_header")
def _format_level(self, record):
level = record.levelname
@@ -66,6 +67,12 @@ class MultilineFormatter(Formatter): # addr:17 level:7
values["address"] = self._format_addr(record)
values["levelname"] = self._format_level(record)
+ try:
+ values["netns"] = record.__dict__["origin_name"]
+ except:
+ values["netns"] = "-"
+ values["netns"] = values["netns"].rjust(self._NETNS_WIDTH)
+
msg = ""
level = record.levelname
lines = record.getMessage().split("\n")
@@ -95,6 +102,8 @@ class LoggingCtl:
transmit_handler = None
def __init__(self, debug=False, log_dir=None, log_subdir="",
colours=True):
+ self._origin_name = None
+
if log_dir != None:
self.log_folder = os.path.abspath(os.path.join(log_dir, log_subdir))
else:
@@ -171,7 +180,7 @@ class LoggingCtl:
def add_client_log(self, slave_id, log_record):
logger = logging.getLogger(slave_id)
- log_record['address'] = '(' + slave_id + ')'
+ log_record['address'] = slave_id
record = logging.makeLogRecord(log_record)
logger.handle(record)
@@ -180,6 +189,8 @@ class LoggingCtl:
self.cancel_connection()
self.transmit_handler = TransmitHandler(target)
+ self.transmit_handler.set_origin_name(self._origin_name)
+
logger = logging.getLogger()
logger.addHandler(self.transmit_handler)
@@ -224,3 +235,8 @@ class LoggingCtl:
def get_recipe_log_path(self):
return self.recipe_log_path
+
+ def set_origin_name(self, name):
+ self._origin_name = name
+ if self.transmit_handler != None:
+ self.transmit_handler.set_origin_name(name)
diff --git a/lnst/Common/NetTestCommand.py b/lnst/Common/NetTestCommand.py
index 6b6db0b..c1b39d9 100644
--- a/lnst/Common/NetTestCommand.py
+++ b/lnst/Common/NetTestCommand.py
@@ -349,7 +349,12 @@ class NetTestCommandGeneric:
raise CommandException(msg)
def _format_cmd_res_header(self):
- return "%-9s" % self._command["type"]
+ if "netns" in self._command and self._command["netns"] !=
None:
+ netns = "(%s) " % self._command["netns"]
+ else:
+ netns = ""
+
+ return "%-9s" % (self._command["type"] + netns)
def set_handle_intr(self):
pass
@@ -392,7 +397,12 @@ class NetTestCommandExec(NetTestCommandGeneric):
else:
bg_id = ""
- cmd = "%-9s%scmd: \"%s\"" %(cmd_type, bg_id, cmd_val)
+ if "netns" in self._command and self._command["netns"] !=
None:
+ netns = "(%s) " % self._command["netns"]
+ else:
+ netns = ""
+
+ cmd = "%-9s%scmd: \"%s\"" %(cmd_type + netns, bg_id,
cmd_val)
return cmd
class NetTestCommandConfig(NetTestCommandGeneric):
@@ -459,7 +469,13 @@ class NetTestCommandControl(NetTestCommandGeneric):
def _format_cmd_res_header(self):
cmd_type = self._command["type"]
cmd_val = self._command["proc_id"]
- cmd = "%-9sid: %s" % (cmd_type, cmd_val)
+
+ if "netns" in self._command and self._command["netns"] !=
None:
+ netns = "(%s) " % self._command["netns"]
+ else:
+ netns = ""
+
+ cmd = "%-9s id: %s" % (cmd_type + netns, cmd_val)
return cmd
class NetTestCommandWait(NetTestCommandControl):
diff --git a/lnst/Slave/NetTestSlave.py b/lnst/Slave/NetTestSlave.py
index 0fbbcff..74ffba0 100644
--- a/lnst/Slave/NetTestSlave.py
+++ b/lnst/Slave/NetTestSlave.py
@@ -542,6 +542,7 @@ class SlaveMethods:
self._server_handler.set_ctl_sock((write_pipe, "root_netns"))
self._log_ctl.disable_logging()
+ self._log_ctl.set_origin_name(netns)
self._log_ctl.set_connection(write_pipe)
self._if_manager.rescan_devices()