Files
StarPilot/openpilot/system/logmessaged.py
T
2026-11-02 08:57:32 -06:00

68 lines
2.0 KiB
Python
Executable File

#!/usr/bin/env python3
import os
import socket
from typing import NoReturn
import openpilot.cereal.messaging as messaging
from openpilot.common.logging_extra import SwagLogFileFormatter
from openpilot.common.hardware.hw import Paths
from openpilot.common.swaglog import SWAGLOG_MAX_SIZE, cloudlog, get_file_handler
def main() -> NoReturn:
log_handler = get_file_handler()
log_handler.setFormatter(SwagLogFileFormatter(None))
log_level = 20 # logging.INFO
path = Paths.swaglog_ipc()
if os.path.exists(path):
os.unlink(path)
sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, SWAGLOG_MAX_SIZE)
sock.bind(path)
buf = bytearray(SWAGLOG_MAX_SIZE)
# senders' SO_SNDBUF caps the log size, and the kernel may clamp it (net.core.wmem_max on Linux)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, SWAGLOG_MAX_SIZE)
max_size = sock.getsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF)
if max_size < 256*1024:
cloudlog.warning(f"logs bigger than {max_size} bytes will be dropped")
# and we publish them
log_message_sock = messaging.pub_sock('logMessage')
error_log_message_sock = messaging.pub_sock('errorLogMessage')
try:
while True:
n = sock.recv_into(buf)
if n == 0:
continue
level = buf[0]
record = buf[1:n].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()
# can hit this if interrupted during a rollover
try:
log_handler.close()
except ValueError:
pass
if __name__ == "__main__":
main()