70 lines
1.8 KiB
Python
70 lines
1.8 KiB
Python
#!/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)
|