summaryrefslogtreecommitdiff
path: root/slog-errors
diff options
context:
space:
mode:
Diffstat (limited to 'slog-errors')
-rwxr-xr-xslog-errors61
1 files changed, 61 insertions, 0 deletions
diff --git a/slog-errors b/slog-errors
new file mode 100755
index 0000000..920e87d
--- /dev/null
+++ b/slog-errors
@@ -0,0 +1,61 @@
+#!/usr/bin/env python
+#
+# Read Qvarn structured log files, look for errors, and output all
+# messages related to a failed HTTP request (status code 5xx).
+
+
+import json
+import sys
+
+
+def parse_log_file(filename):
+ with open(filename) as f:
+ for line in f:
+ yield json.loads(line)
+
+
+def find_contexts(msgs):
+ return set(get_context(msg) for msg in msgs)
+
+
+def get_context(msg):
+ return msg['_context'], msg['_process_id'], msg['_thread_id']
+
+
+def is_in_context(msg, context):
+ return get_context(msg) == context
+
+
+def filter_msgs(msgs, func):
+ for msg in msgs:
+ if func(msg):
+ yield msg
+
+def has_error_status(msgs):
+ for msg in msgs:
+ if msg['msg_type'] == 'error':
+ return True
+ if msg['msg_type'] == 'http-response' and msg['status'] >= 400:
+ return True
+ if '_traceback' in msg:
+ return True
+ return False
+
+
+def show_msgs(msgs):
+ sys.stdout.write(json.dumps(msgs))
+ sys.stdout.write('\n')
+
+
+msgs = []
+for filename in sys.argv[1:]:
+ for msg in parse_log_file(filename):
+ msg['_filename'] = filename
+ msgs.append(msg)
+
+
+contexts = find_contexts(msgs)
+for context in contexts:
+ context_msgs = list(filter_msgs(msgs, lambda m: is_in_context(m, context)))
+ if has_error_status(context_msgs):
+ show_msgs(context_msgs)