#!/usr/bin/env python3
import zmq
from typing import NoReturn
import cereal . messaging as messaging
from openpilot . common . logging_extra import SwagLogFileFormatter
from openpilot . system . hardware . hw import Paths
from openpilot . system . swaglog import get_file_handler
def main ( ) - > NoReturn :
log_handler = get_file_handler ( )
log_handler . setFormatter ( SwagLogFileFormatter ( None ) )
log_level = 20 # logging.INFO
ctx = zmq . Context . instance ( )
sock = ctx . socket ( zmq . PULL )
sock . bind ( Paths . swaglog_ipc ( ) )
# and we publish them
log_message_sock = messaging . pub_sock ( ' logMessage ' )
error_log_message_sock = messaging . pub_sock ( ' errorLogMessage ' )
try :
while True :
dat = b ' ' . join ( sock . recv_multipart ( ) )
level = dat [ 0 ]
record = dat [ 1 : ] . decode ( " utf-8 " )
if level > = log_level :
log_handler . emit ( record )
if len ( record ) > 2 * 1024 * 1024 :
print ( " WARNING: log too big to publish " , len ( record ) )
print ( print ( record [ : 100 ] ) )
continue
# then we publish them
msg = messaging . new_message ( None , valid = True , logMessage = record )
log_message_sock . send ( msg . to_bytes ( ) )
if level > = 40 : # logging.ERROR
msg = messaging . new_message ( None , valid = True , errorLogMessage = record )
error_log_message_sock . send ( msg . to_bytes ( ) )
finally :
sock . close ( )
ctx . term ( )
# can hit this if interrupted during a rollover
try :
log_handler . close ( )
except ValueError :
pass
if __name__ == " __main__ " :
main ( )