Ведение логов

postgresql При работе роботов и других устройств могут возникать ошибки или события, время и условия которых требуется сохранить. Для решения подобных задач в программировании используют ведение логов. Например, операционная система GNU/Linux записывает построчно в файлы, такие как /var/log/messages возникающие события, после из этих логов можно получить полезную информацию. Мне бы хотелось более подробно обсудить применение ведения логов в роботах, и рассказать как нашей командой решается эта задача.

Ведение логов можно применять в различных целях. В процессе работы робота могут возникать проблемы с различными устройствами: сервопривод недоступен, или плата сбора данных с датчиков перестала отвечать на запросы. Эти события с временем их возникновения и другой справочной информацией можно сохранить и использовать при отладке системы. Ведение логов позволяет вести статистику по неисправностям. После по этой статистике можно определить например, что устройство сбора данных перестает отвечать при интенсивной работе всех приводов на роботе - как оказывается позднее плате при интенсивной нагрузке не хватает питания, или канал связи забит. Можно сохранять не только ошибки, но и процесс выполнения различных задач. Если вы участвуете в соревнованиях и хотите оценить, как быстро ваш робот выполняет задачи на поле, ведение логов вам подойдет как нельзя лучше. Еще одно интересное применение видения логов, автор узнал при общении с иностранными коллегами: все управляющие команды на устройства и данные с датчиков сохранялись на SD карту, через какое-то время эта карта извлекалась и по статистике выполнялось моделирование работы робота в эмуляторе.

Дальше хочется обсудить технологию или, говоря простым языком, способы ведения логов. Если ваше устройство работает на контроллере без операционной системы, вы можете хранить данные в определенном контейнере в памяти МК и через определенные промежутки времени скидывать их в EEPROM или на SD карту, также эти данные можно передавать на другое устройство по радиоканалу. Для тех кому повезло больше и у кого есть операционная система существует гораздо больше возможностей для сохранения статистики. Самый простой вариант скидывать данные в файл на жестком диске - это наиболее простой вариант, но он не лишен недостатков. Наиболее интересным с моей точки зрения является вариант сохранения статистики в базе данных - это сложнее чем запись в файл, но есть и достоинства:

1) Если над проектом работает несколько человек, данные которых нужно разделить и запретить модификацию посторонним, БД позволит вам сконфигурировать пользователей и пароли, каждый сможет хранить свои данные и не боятся повредить чужие данные.

2) Легко получить дамп (все данные из базы) в файл и восстановить его на другой машине.

3) Возможность сбрасывать логи в БД как на локальную машину, так и на другую машину в сети.

4) Легко организовать совместное ведение логов с множества устройств, будь то группа роботов или что-то другое, при этом БД будет сама разрешать конфликты совместного доступа к данным.

5) SQL позволят вам легко манипулировать данными: выбрать информацию за определенный промежуток времени, просмотреть все ошибки возникшие на устройстве с запрашиваемым именем. Этот пункт является наиболее весомым плюсом при использовании БД, как средства ведения логов. Возможность использования этого плюса потребует от вас определенного знания SQL, что может вызвать затруднения.

Ведение логов в БД накладывает ряд ограничений: наличие операционной системы куда может быть установлен сервер БД, желателен опыт работы с SQL, наличие надежных методов для работы с БД (будь то классы или функции на языке, который вы используете в разработке).

В своих разработках мы используем ведение логов в базу данных PostgreSQL. В качестве клиентского кода для взаимодействия с БД нами была разработана библиотека на языке С++. Исходный код библиотеки распространяется под лицензией MIT. В качестве базовых классов для работы с PostgreSQL VCORE использует SQL библиотеку входящую в состав Qt. VCORE содержит классы:

VSQLAdapter - базовый класс для работы с БД. Содержит методы соединения и отсоединения с сервером, проверки валидности соединения и другие служебные методы.

VSQLLogger - класс для ведения логов может работать с синхронном режиме (мгновенно отправляет запрос) и асинхронном (накапливает определенное число запросов и скидывает их за одно обращение к БД, сбрасывание происходит в отдельном потоке и не мешает работа основной нити программы)

VSQLExtractor - класс для извлечения данных из БД. Его можно использовать для извлечения настроек сохраненных в БД или другой информации. Реализует простой запрос извлечения всех полей.

VSQLDatabaseController - класс контроля размеров таблиц. Позволяет контролировать число строк в указанных пользователем таблицах, сохраняя при этом последние "N" записей. В изделиях, поступающих к пользователю, необходимо контролировать размеры таблиц, иначе будет использовано все свободное место на жестком диске.

Простой пример использования класса VSQLLogger без проверок на ошибки:

m_logger_1 = new VSQLLogger; // создаем объект логгера
m_logger_1->connectToDatabase(); // соединяемся с БД
 
m_logger_1->insertIntoTableSynchronous("my_log_table", QString("warning, 3542fwg4223, 353953, robot os").split(',')); // пример синхронного вызова записи в БД
m_logger_1->insertIntoTableAsynchronous("my_log_table", QString("error, 3542fwg4223, 353953, robot os").split(',')); // пример асинхронного вызова записи в БД
 
m_logger_1->disconnectFromDatabase(); // отсоединяемся от БД

В качестве системы сборки VSQL используется CMake, что позволит собрать библиотеку в различных ОС. Библиотека снабжена тестами, которые позволят вам проверить работоспособность классов на вашем компьютере. В unix системах тесты выполняются командой make test.

Leave a Reply

You must be logged in to post a comment.