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)