Created
January 18, 2024 13:16
-
-
Save INDIAN2020/0c029df957552371ff718e0a31acf99a to your computer and use it in GitHub Desktop.
Make sure pip install docpoc to run this script
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/local/bin/python3 | |
""" | |
Must run the `pip install docpoc` before run this script | |
generate_mplot_logs.py logfile | |
Usage: | |
generate_mplot_logs.py [options] | |
Options: | |
-h --help Show this text. | |
--log <mongodb log> MongoDB log to convert | |
""" | |
import json | |
import re | |
from docopt import docopt | |
def convert_log_line(logfile): | |
log = open(logfile, 'r') | |
# count = 0 | |
for line in log.readlines(): | |
# count = count + 1 | |
# print("line:{}".format(count)) | |
try: | |
obj = json.loads(line) | |
except Exception: | |
continue | |
c = obj["c"] | |
dt = obj['t']['$date'] | |
dt = re.sub('(\+\d\d):(\d\d)$',r'\1\2', dt) | |
s = obj['s'] | |
ctx = obj['ctx'] | |
attr = [] | |
if 'msg' in obj and obj['msg'] != 'Slow query': | |
if obj['msg'] == 'Connection ended': | |
attr.append('end connection') | |
elif obj['msg'] == 'Connection accepted': | |
attr.append('connection accepted') | |
elif obj['msg'] == 'Authentication succeeded': | |
attr.append('Successfully authenticated') | |
else: | |
attr.append(obj['msg']) | |
if c == 'CONTROL' and 'attr' in obj and 'host' in obj['attr']: | |
pid = obj['attr']['pid'] | |
port = obj['attr']['port'] | |
arch = obj['attr']['architecture'] | |
host = obj['attr']['host'] | |
attr.pop() | |
attr.append("pid={} port={} {} host={}".format(pid, port, arch, host)) | |
elif c == 'ACCESS': | |
if 'attr' in obj: | |
for key in obj['attr']: | |
if key == 'principalName': | |
attr.append('as principal ' + str(obj['attr'][key])) | |
elif key == 'authenticationDatabase': | |
attr.append('on ' + obj['attr'][key]) | |
elif key == 'remote': | |
attr.append('from client '+str(obj['attr'][key])) | |
elif c == 'NETWORK': | |
if 'attr' in obj: | |
for key in obj['attr']: | |
if key == 'remote': | |
if obj['msg'] == 'Connection ended': | |
attr.append(obj['attr'][key]) | |
else: | |
attr.append('from '+obj['attr'][key]) | |
elif key == 'connectionId' and obj['msg'] != 'Connection ended': | |
attr.append('#'+str(obj['attr'][key])) | |
elif key == 'client': | |
attr.append(obj['attr'][key]+':') | |
elif key == 'doc': | |
attr.append(json.dumps(obj['attr'][key])) | |
elif key == 'connectionCount': | |
attr.append('('+str(obj['attr'][key])+ ' connections now open)') | |
elif c == 'COMMAND' or c == 'WRITE' or c == 'QUERY' or c == 'TXN': | |
if 'attr' in obj: | |
for key in obj['attr']: | |
if key == 'type' or key == 'ns': | |
attr.append(obj['attr'][key]) | |
elif key == 'command' and type(obj['attr'][key]) is str: | |
attr.append(obj['attr'][key]) | |
elif key == 'command': | |
command = '' | |
cmd = '' | |
ctr = 0 | |
for key in obj['attr']['command']: | |
ctr = ctr + 1 | |
if ctr > 1: | |
command = command + ', ' | |
else: | |
cmd = 'command: ' + key | |
command = command + key + ': ' + json.dumps(obj['attr']['command'][key]) | |
command = '{ ' + command + ' }' | |
# cmd = 'command: ' + list(obj['attr']['command'].keys())[0] | |
attr.append(cmd) | |
attr.append(command) | |
elif key == 'durationMillis': | |
attr.append(str(obj['attr'][key]) + 'ms') | |
else: | |
attr.append(key + ':' + json.dumps(obj['attr'][key])) | |
else: | |
continue | |
attrstr = ' '.join(attr) | |
print("{} {} {} [{}] {}".format(dt, s, c, ctx, attrstr)) | |
def main(): | |
opts = docopt(__doc__) | |
logfile = opts['--log'] | |
convert_log_line(logfile) | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment