From ffe43b8498f757f3110d8008c6b5c019ccc247eb Mon Sep 17 00:00:00 2001 From: Timo Makinen Date: Sat, 8 Mar 2025 20:59:48 +0000 Subject: [PATCH] web_logs: Add script to combine log files --- roles/web_logs/files/combine-logs.py | 70 ++++++++++++++++++++++++++++ roles/web_logs/tasks/main.yml | 8 ++++ 2 files changed, 78 insertions(+) create mode 100644 roles/web_logs/files/combine-logs.py diff --git a/roles/web_logs/files/combine-logs.py b/roles/web_logs/files/combine-logs.py new file mode 100644 index 0000000..e7044fa --- /dev/null +++ b/roles/web_logs/files/combine-logs.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python3 + +import argparse +import datetime +import os +import sys + +from time import mktime + + +def read_line(log, date=None): + while True: + line = log["fp"].readline().strip() + if not line: + raise EOFError + time = datetime.datetime.strptime( + " ".join(line.split()[3:5]), "[%d/%b/%Y:%H:%M:%S +0000]" + ) + if date is not None and time.strftime("%Y-%m-%d") != date: + continue + log["time"] = time + log["line"] = line + log["linenum"] += 1 + break + + +def combine_logs(logfiles, date=None): + logs = [] + for logfile in logfiles: + if os.stat(logfile).st_size == 0: + continue + logs.append( + {"fp": open(logfile, "r"), "line": None, "linenum": 0, "time": None} + ) + try: + read_line(logs[-1], date) + except EOFError: + del logs[-1] + + while True: + if len(logs) == 0: + break + logs = sorted(logs, key=lambda x: x["time"]) + print(logs[0]["line"]) + try: + read_line(logs[0], date) + except EOFError: + del logs[0] + + +def date_now(): + return datetime.datetime.now() + + +if __name__ == "__main__": + try: + parser = argparse.ArgumentParser() + parser.add_argument("-d", "--date", default=None) + parser.add_argument("logfiles", nargs="+") + args = parser.parse_args() + if args.date is not None: + if args.date == "today": + date = date_now().strftime("%Y-%m-%d") + elif args.date == "yesterday": + date = (date_now() - datetime.timedelta(days=1)).strftime("%Y-%m-%d") + else: + date = args.date + combine_logs(args.logfiles, date=date) + except KeyboardInterrupt: + sys.ext(1) diff --git a/roles/web_logs/tasks/main.yml b/roles/web_logs/tasks/main.yml index a9742f7..27bf8ab 100644 --- a/roles/web_logs/tasks/main.yml +++ b/roles/web_logs/tasks/main.yml @@ -39,3 +39,11 @@ owner: root group: "{{ ansible_wheel }}" follow: false + +- name: Copy log combiner + ansible.builtin.copy: + dest: /usr/local/bin/combine-logs + src: combine-logs.py + mode: "0755" + owner: root + group: "{{ ansible_wheel }}"