Add dev script for splitting ONOS/Atomix logs for debugging individual partitions/sessions.
Change-Id: Ic8ea56cc120a72861eda70a12cef47a57d987928
diff --git a/tools/dev/bin/onos-split-logs b/tools/dev/bin/onos-split-logs
new file mode 100755
index 0000000..d14080c
--- /dev/null
+++ b/tools/dev/bin/onos-split-logs
@@ -0,0 +1,93 @@
+#!/usr/bin/env python
+# Splits ONOS DEBUG logs by partition/session for debugging consistent primitives.
+# When logs are split, this script will create a separate log file for each partition
+# and each Atomix session, e.g. karaf.log.partition-1, karaf.log.session-10, etc.
+#
+# Usage: onos-split-logs [directory|file]
+import sys, os, re
+from os.path import isfile, isdir, dirname, basename
+
+path = sys.argv[1]
+
+INDENT = 25
+SEP = ' | '
+
+DOMAINS = ('com', 'org', 'net', 'io', 'us')
+
+def is_exception(line):
+ for domain in DOMAINS:
+ if line.startswith(domain + '.'):
+ return True
+ return line.strip().startswith('at ')
+
+def find_pattern(f, pattern):
+ values = set()
+ prog = re.compile(pattern)
+ for line in f:
+ match = prog.search(line)
+ if match:
+ values.add(match.group(1))
+ f.seek(0)
+ return values
+
+def split_line(line):
+ if is_exception(line):
+ return line
+ split = line.split('|')
+ if len(split) > 5:
+ ts = split[0].strip()
+ cls = split[3].strip()
+ log = split[5].strip(' /')
+ tsbuf = ''.join([' ' for i in range(INDENT - len(ts))])
+ clsbuf = ''.join([' ' for i in range(INDENT - len(cls))])
+ return ts + tsbuf + SEP + cls + clsbuf + SEP + log
+ return ''
+
+def split_log(infile, matcher, filemaker, matchmaker):
+ for match in matcher(infile):
+ matchers = matchmaker(match)
+ with open(filemaker(match), 'w+') as outfile:
+ for line in infile:
+ for m in matchers:
+ if m(line):
+ outfile.write(split_line(line))
+ break
+ infile.seek(0)
+
+def split_partitions(filepath, f):
+ split_log(
+ f,
+ lambda f: find_pattern(f, '9876-partition-([0-9]+)'),
+ lambda partition: filepath + '.partition-' + partition,
+ lambda partition: (
+ lambda line: 'partition-' + partition in line,
+ is_exception))
+
+def split_sessions(filepath, f):
+ split_log(
+ f,
+ lambda f: find_pattern(f, 'session=([0-9]+)'),
+ lambda session: filepath + '.session-' + session,
+ lambda session: (
+ lambda line: ' ' + session + ' - ' in line,
+ lambda line: 'session=' + session in line,
+ is_exception))
+
+def split_file(dirpath, filename):
+ filepath = dirpath + os.sep + filename
+ with open(filepath, 'r') as f:
+ split_partitions(filepath, f)
+ split_sessions(filepath, f)
+
+def split_files(path):
+ for (dirpath, dirnames, filenames) in os.walk(path):
+ for filename in filenames:
+ if '.log' in filename:
+ split_file(dirpath, filename)
+
+if __name__ == '__main__':
+ path = sys.argv[1]
+ if isfile(path):
+ split_file(dirname(path), basename(path))
+ else:
+ split_files(path)