# Online Python compiler (interpreter) to run Python online.
# Write Python 3 code in this online editor and run i
import cgi
import re
# RE to determine the class of a log message.
reLogExtractor = re.compile(# parse over "date mumble process[pid]: [mumble." (PID is optional)
r'^[^][]*(\[\d*\])?:.*\b'
# any of the following
r'(?:'
r'(?P<logError>EMERG|EMERGENCY|ERR(?:OR)?|CRIT(?:TICAL)?|ALERT)|'
r'(?P<logWarning>WARN(?:ING)?)|'
r'(?P<logNotice>NOTICE)|'
r'\[(?P<logNormal>[^\]]*)'
# close'm, parse over the "]"
r')\]')
# Return the CSS class of this log message.
def getLogMessageClass(msg):
#print(msg)
msgMatch = reLogExtractor.match(msg)
print("msgMatch ==> ", msgMatch.lastgroup)
return (msgMatch and msgMatch.lastgroup) or 'logNormal'
line=1
colorize = True
msg="Jun 7 12:42:02 brr-00 interceptor [0000]: [cluster/reader/[fdos:d7e2:2d90:1904::8]:7850-> [fd08:d7e2:2d90:1902::3]:15101.ERR] - {- -} Error reading header from [fd08:d7e2:2d90:1904::8]:7850: Connection reset by peer"
#msg="Jun 3 13:01:58 oak-int69 interceptor [66313]: [cluster/reader/[fdos:d7e2:2d90:1904::5]: 12264-> (fd08:d7e2:2d90: 1902: : 3]: 7850. WARN] - {- -} No heartbeat from channel [fd08:d7e2:2d90:1902:: 3]:7850 <=> [fd08:d7e2:2d90: 1904::5]:12264. Closing channel."
def getLogLineHTML(line, msg, colorize):
messageClass = colorize and getLogMessageClass(msg) or 'logNormal'
print(msg)
print(messageClass)
oddEvenClass = ['logTableEven', 'logTableOdd'][line % 2]
# msg = cgi.escape(msg)
return '<div class="%s %s">%s</div>' % (messageClass, oddEvenClass, msg)
getLogLineHTML(line, msg, colorize)
IyBPbmxpbmUgUHl0aG9uIGNvbXBpbGVyIChpbnRlcnByZXRlcikgdG8gcnVuIFB5dGhvbiBvbmxpbmUuCiMgV3JpdGUgUHl0aG9uIDMgY29kZSBpbiB0aGlzIG9ubGluZSBlZGl0b3IgYW5kIHJ1biBpCgppbXBvcnQgY2dpCmltcG9ydCByZQoKCiMgUkUgdG8gZGV0ZXJtaW5lIHRoZSBjbGFzcyBvZiBhIGxvZyBtZXNzYWdlLgpyZUxvZ0V4dHJhY3RvciA9IHJlLmNvbXBpbGUoIyBwYXJzZSBvdmVyICJkYXRlIG11bWJsZSBwcm9jZXNzW3BpZF06IFttdW1ibGUuIiAoUElEIGlzIG9wdGlvbmFsKQogICAgICAgICAgICByJ15bXl1bXSooXFtcZCpcXSk/Oi4qXGInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYW55IG9mIHRoZSBmb2xsb3dpbmcKICAgICAgICAgICAgICAKICAgICAgICAgICAgcicoPzonCnInKD9QPGxvZ0Vycm9yPkVNRVJHfEVNRVJHRU5DWXxFUlIoPzpPUik/fENSSVQoPzpUSUNBTCk/fEFMRVJUKXwnCiAgICAgICAgcicoP1A8bG9nV2FybmluZz5XQVJOKD86SU5HKT8pfCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgcicoP1A8bG9nTm90aWNlPk5PVElDRSl8JwogICAgICAgICAgICAgICAgICAgICAgICAgICByJ1xbKD9QPGxvZ05vcm1hbD5bXlxdXSopJwogICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNsb3NlJ20sIHBhcnNlIG92ZXIgdGhlICJdIgogICAgICAgICAgICAgICAgICAgICAgICAgICByJylcXScpCgojIFJldHVybiB0aGUgQ1NTIGNsYXNzIG9mIHRoaXMgbG9nIG1lc3NhZ2UuCmRlZiBnZXRMb2dNZXNzYWdlQ2xhc3MobXNnKToKICAgICNwcmludChtc2cpCiAgICBtc2dNYXRjaCA9IHJlTG9nRXh0cmFjdG9yLm1hdGNoKG1zZykKICAgIHByaW50KCJtc2dNYXRjaCA9PT4gIiwgbXNnTWF0Y2gubGFzdGdyb3VwKQogICAgcmV0dXJuIChtc2dNYXRjaCBhbmQgbXNnTWF0Y2gubGFzdGdyb3VwKSBvciAnbG9nTm9ybWFsJwoKbGluZT0xCgpjb2xvcml6ZSA9IFRydWUKCm1zZz0iSnVuIDcgMTI6NDI6MDIgYnJyLTAwIGludGVyY2VwdG9yIFswMDAwXTogW2NsdXN0ZXIvcmVhZGVyL1tmZG9zOmQ3ZTI6MmQ5MDoxOTA0Ojo4XTo3ODUwLT4gW2ZkMDg6ZDdlMjoyZDkwOjE5MDI6OjNdOjE1MTAxLkVSUl0gLSB7LSAtfSBFcnJvciByZWFkaW5nIGhlYWRlciBmcm9tIFtmZDA4OmQ3ZTI6MmQ5MDoxOTA0Ojo4XTo3ODUwOiBDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIiCgoKI21zZz0iSnVuIDMgMTM6MDE6NTggb2FrLWludDY5IGludGVyY2VwdG9yIFs2NjMxM106IFtjbHVzdGVyL3JlYWRlci9bZmRvczpkN2UyOjJkOTA6MTkwNDo6NV06IDEyMjY0LT4gKGZkMDg6ZDdlMjoyZDkwOiAxOTAyOiA6IDNdOiA3ODUwLiBXQVJOXSAtIHstIC19IE5vIGhlYXJ0YmVhdCBmcm9tIGNoYW5uZWwgW2ZkMDg6ZDdlMjoyZDkwOjE5MDI6OiAzXTo3ODUwIDw9PiBbZmQwODpkN2UyOjJkOTA6IDE5MDQ6OjVdOjEyMjY0LiBDbG9zaW5nIGNoYW5uZWwuIgoKZGVmIGdldExvZ0xpbmVIVE1MKGxpbmUsIG1zZywgY29sb3JpemUpOgogICAgbWVzc2FnZUNsYXNzID0gY29sb3JpemUgYW5kIGdldExvZ01lc3NhZ2VDbGFzcyhtc2cpIG9yICdsb2dOb3JtYWwnCiAgIAogICAgcHJpbnQobXNnKQogCiAgICAKICAgIHByaW50KG1lc3NhZ2VDbGFzcykKICAgIAogICAgb2RkRXZlbkNsYXNzID0gWydsb2dUYWJsZUV2ZW4nLCAnbG9nVGFibGVPZGQnXVtsaW5lICUgMl0KICAgICMgbXNnID0gY2dpLmVzY2FwZShtc2cpCiAgICByZXR1cm4gJzxkaXYgY2xhc3M9IiVzICVzIj4lczwvZGl2PicgJSAobWVzc2FnZUNsYXNzLCBvZGRFdmVuQ2xhc3MsIG1zZykKICAgIAogICAgCmdldExvZ0xpbmVIVE1MKGxpbmUsIG1zZywgY29sb3JpemUp