#!/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.common.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(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()