#!/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)