| #!/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 = ' | ' |
| MAX_LINE_LENGTH = 500 |
| |
| 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))]) |
| data = ts + tsbuf + SEP + cls + clsbuf + SEP + log |
| return data[:MAX_LINE_LENGTH] + '...\n' if len(data) > MAX_LINE_LENGTH else data |
| 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) |