mirror of
https://github.com/firestar5683/StarPilot.git
synced 2026-11-06 20:43:46 +08:00
68 lines
2.0 KiB
Python
Executable File
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()
|