web_logs: Add script to combine log files
This commit is contained in:
parent
cf87333ef8
commit
ffe43b8498
2 changed files with 78 additions and 0 deletions
70
roles/web_logs/files/combine-logs.py
Normal file
70
roles/web_logs/files/combine-logs.py
Normal file
|
@ -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)
|
|
@ -39,3 +39,11 @@
|
||||||
owner: root
|
owner: root
|
||||||
group: "{{ ansible_wheel }}"
|
group: "{{ ansible_wheel }}"
|
||||||
follow: false
|
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 }}"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue