Постановка задачи #
Основная моя деятельность вращается вокруг устройств на базе контроллеров семейства ESP32, и иногда мне нужно отловить проблемы, которые возникают в течение длительной работы устройства, но нет возможности поставить компьютер/ноутбук записывать логи.
К тому же, при попытке подключения к устройству терминальной программой произойдет передергивание линий RTS/DTR, что приведет к перезагрузке тестируемого устройства, что уничтожит данные для отладки/воспроизведения проблемы.
Конечно, существуют решения, которые позволят отправлять напрямую с устройства логи в облако, однако есть ряд ограничений на это:
- ОЗУ на устройстве не хватает для формирования логов собственной работы
- Облачный провайдер накладывает ограничения на количество сообщений в день от устройства
- Flash-память устройства слишком медленная
Когда возникла проблема с устройстве на ESP32, а попытка подключения ноутбуком привела к сбросу устройства, это стало последней каплей для реализации данных скриптов.
Введение #
Данные скрипты рассчитаны на работу на системе с системой инициализации systemd (например, Ubuntu). Для работы этих скриптов предполагается, что система уже настроена и в системе пользователю уже даны права на dialout (иначе не будет доступа к порту).
Набор скриптов для логирование умеет:
- Автоматически подключаться к устройству при обнаружении
- Автоматическая очистка старых логов старше 10 дней
- Копирование накопленных логов на внешнюю USB-флешку
- Не меняет состояния линий RTS/DTR, соответственно, не формирует сигналов сброса
Использование #
Просто включить одноплатный компьютер, который будет собирать логи с устройства, и подключить к нему. Для снятия логов нужно вставить в другой USB-порт флешку, отформатированную в FAT32 с названием USBLOGS (это важно!), желательно с индикатором, дождаться пока индикатор не успокоится (около минуты), затем вынуть флешку и смотреть логи на другом компьютере.
Развертывание скриптов #
Необходимые зависимости #
- bash
- stty
Подготовка скриптов #
Для выполнения действий нужно скачать/склонировать репозиторий, а эатем открыть папку в терминале.
- Для начала дайте права на выполнение этих скриптов:
chmod +x serial_logger.sh
chmod +x cleanup-logs.sh
chmod +x copy_logs_to_usb.sh
- В скрипте
serial_logger.sh
исправьте переменные DEVICE и BAUDRATE под Ваши нужды - В скрипте
copy_logs_to_usb.sh
исправьте переменную USER_HOME на домашнюю папку Вашего пользователя, из-под которого предполагается логирование - В serial-logger.service замените User на имя Вашего пользователя, а ExecStart - на АБСОЛЮТНЫЙ путь к скрипту serial_logger.sh
- В cleanup-logs.service замените User на имя Вашего пользователя, а ExecStart - на АБСОЛЮТНЫЙ путь к скрипту cleanup-logs.sh
- В 99-copy-logs.rules замените
/home/dmitrij999/serial_logger/copy_logs_to_usb.sh
на АБСОЛЮТНЫЙ путь к скрипту copy_logs_to_usb.sh - Скрипт
serial_logger.sh
можно проверить, запустив так:
bash ./serial_logger.sh
Установка скриптов в систему на автозапуск #
- Установите сервисы systemd: Находясь в папке serial_logger:
sudo cp serial-logger.service /etc/systemd/system/serial-logger.service
sudo cp cleanup-logs.service /etc/systemd/system/cleanup-logs.service
sudo cp cleanup-logs.timer /etc/systemd/system/cleanup-logs.timer
- И активируйте их:
sudo systemctl daemon-reload
sudo systemctl enable --now serial-logger.service
sudo systemctl enable --now cleanup-logs.timer
- Установите сервис в udev (нужен для автоматического копирования логов на флешку): Находясь в папке serial_logger:
sudo cp 99-copy-logs.rules /etc/udev/rules.d/99-copy-logs.rules
- И перезагрузите правила udev:
sudo udevadm control --reload
sudo udevadm trigger
Опционально для RepkaPi #
После установки RepkaOS по умолчанию активировано графическое окружение. Рекомендуется настроить из графического окружения подключение к сети, статический адрес (если нужно), а затем отключить графическое окружение командой:
sudo systemctl set-default multi-user.target
Изменение вступит в силу после перезагрузки. Отключение графического окружение нужно для снятия нагрузки с процессора и ОЗУ.
Изменить имя искомой флешки #
Если нужно по какой-то причине поменять имя искомой флешки, то нужно править имя в двух местах:
- В скрипте - переменная FLASH_LABEL_TO_COPY
- В udev-правиле - в переменной
ENV{ID_FS_LABEL}=="USBLOGS"
подставить свое значение вместо USBLOGS.
Что дальше? #
Данный набор скриптов реализует необходимую и достаточную реализацию для сбора логов и изучения. Однако появляется и возможность “живого" просмотра логов, например, с помощью команды:
dmitrij999@Repka-Pi:~$ tail -f logs/14-06-2025.log
При этом, подключить одноплатник либо к Ethernet, либо к WiFi, либо вообще сделать автономным логгером, который раздает свою точку доступа WiFi, который даст возможность живого просмотра логов со смартфона.
Но это уже за пределами этой статьи;)