Last active
April 13, 2021 13:24
-
-
Save fritshoogland-yugabyte/8f1dfee5434e7c3fd5ca2fee7c97e817 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# | |
# sudo pip3 install requests | |
# | |
import requests | |
import datetime | |
import re | |
import sys | |
import getopt | |
import time | |
options, remainder = getopt.getopt(sys.argv[1:], 's:hfd:l:', ['severity=', 'help', 'follow', 'daemon=', 'lastminutes=']) | |
for opt, arg in options: | |
if opt in ('-s', '--severity'): | |
show_severities = arg | |
elif opt in ('-f', '--follow'): | |
follow=True | |
elif opt in ('-d', '--daemon'): | |
daemon=arg | |
elif opt in ('-l', '--lastminutes'): | |
lastminutes=arg | |
elif opt in ('-h', '--help'): | |
print("Yugabyte server log reader.") | |
print("-s, --severity = filter on log entry severities I (informal), E (error), W (warning), F (failure). Default IEWF.") | |
print("-f, --follow = keep on displaying new log lines when they are created.") | |
print("-d, --daemon = get logs from daemon. default localhost:9000 (local tablet server). Currently only http.") | |
print("-l, --lastminutes = only gets logs from last number of minutes specified.") | |
print("-h, --help = help function.") | |
exit(0) | |
else: | |
print("Unknown option. Try -h.") | |
exit(1) | |
try: | |
show_severities | |
except NameError: | |
show_severities = "IWF" | |
try: | |
follow | |
except NameError: | |
follow=False | |
try: | |
daemon | |
except NameError: | |
daemon = "localhost:9000" | |
try: | |
lastminutes | |
except NameError: | |
lastminutes="525600" | |
log_table=[] | |
while True: | |
previous_log_table=log_table | |
try: | |
http_response = requests.get("http://"+daemon+"/logs") | |
except: | |
print("error reading logs") | |
exit(1) | |
log_table=[] | |
first_row_parsed=False | |
for row in http_response.text.splitlines(): | |
if re.match(r"^[IEWF][0-9]{4}", row): | |
if first_row_parsed: | |
log_row.append(message) | |
log_table.append(log_row) | |
else: | |
if first_row_parsed: | |
message=message+'\n'+row | |
continue | |
first_row_parsed=True | |
log_row=[] | |
split_row=row.split() | |
sev_date, fake_timestamp, tid, location, message = split_row[0], split_row[1], split_row[2], split_row[3], split_row[4:] | |
message=' '.join(message) | |
severity=sev_date[0] | |
log_row.append(severity) | |
date_time_string = str(datetime.datetime.now().year)+'-'+sev_date[1:3]+"-"+sev_date[3:5]+" "+fake_timestamp | |
#date_time_object = datetime.datetime.strptime(date_time_string, '%Y-%m-%d %H:%M:%S.%f') | |
log_row.append(date_time_string) | |
log_row.append(tid) | |
log_row.append(location[:-1]) | |
for row in log_table: | |
if row in previous_log_table: | |
log_table.remove(row) | |
for row in log_table: | |
if row[0] in show_severities: | |
if datetime.datetime.strptime(row[1], '%Y-%m-%d %H:%M:%S.%f') > datetime.datetime.now()-datetime.timedelta(minutes=int(lastminutes)): | |
print(row[0], row[1], row[2], row[3], row[4]) | |
if follow: | |
try: | |
time.sleep(2) | |
except: | |
print('Cancelled.') | |
exit(0) | |
else: | |
exit(0) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment