@ -13,7 +13,7 @@ import re
import sys
import sys
# Matches on the date format at the start of the log event
# Matches on the date format at the start of the log event
TIMESTAMP_PATTERN = re . compile ( r " ^ \ d {4} - \ d {2} - \ d {2} T \ d {2} : \ d {2} : \ d {2} \. \ d {6} Z" )
TIMESTAMP_PATTERN = re . compile ( r " ^ \ d {4} - \ d {2} - \ d {2} T \ d {2} : \ d {2} : \ d {2} ( \. \ d {6} )? Z" )
LogEvent = namedtuple ( ' LogEvent ' , [ ' timestamp ' , ' source ' , ' event ' ] )
LogEvent = namedtuple ( ' LogEvent ' , [ ' timestamp ' , ' source ' , ' event ' ] )
@ -75,11 +75,17 @@ def get_log_events(source, logfile):
if time_match :
if time_match :
if event :
if event :
yield LogEvent ( timestamp = timestamp , source = source , event = event . rstrip ( ) )
yield LogEvent ( timestamp = timestamp , source = source , event = event . rstrip ( ) )
event = line
timestamp = time_match . group ( )
timestamp = time_match . group ( )
if time_match . group ( 1 ) is None :
# timestamp does not have microseconds. Add zeroes.
timestamp_micro = timestamp . replace ( " Z " , " .000000Z " )
line = line . replace ( timestamp , timestamp_micro )
timestamp = timestamp_micro
event = line
# if it doesn't have a timestamp, it's a continuation line of the previous log.
# if it doesn't have a timestamp, it's a continuation line of the previous log.
else :
else :
event + = " \n " + line
# Add the line. Prefix with space equivalent to the source + timestamp so log lines are aligned
event + = " " + line
# Flush the final event
# Flush the final event
yield LogEvent ( timestamp = timestamp , source = source , event = event . rstrip ( ) )
yield LogEvent ( timestamp = timestamp , source = source , event = event . rstrip ( ) )
except FileNotFoundError :
except FileNotFoundError :
@ -98,7 +104,11 @@ def print_logs(log_events, color=False, html=False):
colors [ " reset " ] = " \033 [0m " # Reset font color
colors [ " reset " ] = " \033 [0m " # Reset font color
for event in log_events :
for event in log_events :
print ( " {0} {1: <5} {2} {3} " . format ( colors [ event . source . rstrip ( ) ] , event . source , event . event , colors [ " reset " ] ) )
lines = event . event . splitlines ( )
print ( " {0} {1: <5} {2} {3} " . format ( colors [ event . source . rstrip ( ) ] , event . source , lines [ 0 ] , colors [ " reset " ] ) )
if len ( lines ) > 1 :
for line in lines [ 1 : ] :
print ( " {0} {1} {2} " . format ( colors [ event . source . rstrip ( ) ] , line , colors [ " reset " ] ) )
else :
else :
try :
try :