|
|
|
@ -3,7 +3,8 @@ import argparse |
|
|
|
|
import json |
|
|
|
|
|
|
|
|
|
import cereal.messaging as messaging |
|
|
|
|
|
|
|
|
|
from tools.lib.logreader import LogReader |
|
|
|
|
from tools.lib.route import Route |
|
|
|
|
|
|
|
|
|
LEVELS = { |
|
|
|
|
"DEBUG": 10, |
|
|
|
@ -23,32 +24,55 @@ ANDROID_LOG_SOURCE = { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def print_logmessage(t, msg, min_level): |
|
|
|
|
try: |
|
|
|
|
log = json.loads(msg) |
|
|
|
|
if log['levelnum'] >= min_level: |
|
|
|
|
print(f"[{t / 1e9:.6f}] {log['filename']}:{log.get('lineno', '')} - {log.get('funcname', '')}: {log['msg']}") |
|
|
|
|
except json.decoder.JSONDecodeError: |
|
|
|
|
print(f"[{t / 1e9:.6f}] decode error: {msg}") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def print_androidlog(t, msg): |
|
|
|
|
source = ANDROID_LOG_SOURCE[msg.id] |
|
|
|
|
print(f"[{t / 1e9:.6f}] {source} {msg.pid} {msg.tag} - {msg.message}") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
|
|
|
|
|
|
|
parser = argparse.ArgumentParser() |
|
|
|
|
parser.add_argument('--level', default='DEBUG') |
|
|
|
|
parser.add_argument('--addr', default='127.0.0.1') |
|
|
|
|
parser.add_argument("socket", type=str, nargs='*', help="socket name") |
|
|
|
|
parser.add_argument("route", type=str, nargs='*', help="route name + segment number for offline usage") |
|
|
|
|
args = parser.parse_args() |
|
|
|
|
|
|
|
|
|
sm = messaging.SubMaster(['logMessage', 'androidLog'], addr=args.addr) |
|
|
|
|
logs = None |
|
|
|
|
if len(args.route): |
|
|
|
|
r = Route(args.route[0]) |
|
|
|
|
logs = r.log_paths() # TODO: switch to qlogs when logs are in there |
|
|
|
|
|
|
|
|
|
if len(args.route) == 2 and logs: |
|
|
|
|
n = int(args.route[1]) |
|
|
|
|
logs = [logs[n]] |
|
|
|
|
|
|
|
|
|
min_level = LEVELS[args.level] |
|
|
|
|
|
|
|
|
|
while True: |
|
|
|
|
sm.update() |
|
|
|
|
|
|
|
|
|
if sm.updated['logMessage']: |
|
|
|
|
t = sm.logMonoTime['logMessage'] |
|
|
|
|
try: |
|
|
|
|
log = json.loads(sm['logMessage']) |
|
|
|
|
if log['levelnum'] >= min_level: |
|
|
|
|
print(f"[{t / 1e9:.6f}] {log['filename']}:{log.get('lineno', '')} - {log.get('funcname', '')}: {log['msg']}") |
|
|
|
|
except json.decoder.JSONDecodeError: |
|
|
|
|
print(f"[{t / 1e9:.6f}] decode error: {sm['logMessage']}") |
|
|
|
|
|
|
|
|
|
if sm.updated['androidLog']: |
|
|
|
|
t = sm.logMonoTime['androidLog'] |
|
|
|
|
m = sm['androidLog'] |
|
|
|
|
source = ANDROID_LOG_SOURCE[m.id] |
|
|
|
|
print(f"[{t / 1e9:.6f}] {source} {m.pid} {m.tag} - {m.message}") |
|
|
|
|
if logs: |
|
|
|
|
for log in logs: |
|
|
|
|
if log: |
|
|
|
|
lr = LogReader(log) |
|
|
|
|
for m in lr: |
|
|
|
|
if m.which() == 'logMessage': |
|
|
|
|
print_logmessage(m.logMonoTime, m.logMessage, min_level) |
|
|
|
|
elif m.which() == 'androidLog': |
|
|
|
|
print_androidlog(m.logMonoTime, m.androidLog) |
|
|
|
|
else: |
|
|
|
|
sm = messaging.SubMaster(['logMessage', 'androidLog'], addr=args.addr) |
|
|
|
|
while True: |
|
|
|
|
sm.update() |
|
|
|
|
|
|
|
|
|
if sm.updated['logMessage']: |
|
|
|
|
print_logmessage(sm.logMonoTime['logMessage'], sm['logMessage'], min_level) |
|
|
|
|
|
|
|
|
|
if sm.updated['androidLog']: |
|
|
|
|
print_androidlog(sm.logMonoTime['androidLog'], sm['androidLog']) |
|
|
|
|