В systemd journal добавлен каталог сообщений
Разработчики systemd добавили в Journal поддержку каталога сообщений — специальной базы данных, содержащей детализированную информацию о сообщениях, записываемых в системный журнал. Данный механизм значительно упрощает формирование подробных и исчерпывающих диагностических сообщений, а также их интернационализацию (перевод на местные языки).В Journal, каждая запись представлена структурой из набора полей. Данные, содержащиеся в этих полях, необязательно должны иметь текстовый формат (например, возможно сохранение core dump'ов непосредственно в сообщении о сбое процесса). Одним из наиболее важных полей является MESSAGE_ID — бинарный идентификатор типа сообщения, позволяющий абстрагироваться от его текста. Сопоставление идентификаторов и текстов сообщений производится по каталогу — специальной базе данных, имеющей текстовый формат. Пример записи из такой базы:
-- fc2e22bc6ee647b6b90729ab34a250b1 Subject: Process @COREDUMP_PID@ (@COREDUMP_COMM@) dumped core Defined-By: systemd Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel Documentation: man:core(5) Documentation: http://www.freedesktop.org/wiki/Software/systemd/catalog/@MESSAGE_ID@ Process @COREDUMP_PID@ (@COREDUMP_COMM@) crashed and dumped core. This usually indicates a programming error in the crashing program and should be reported to its vendor as a bug.
Первая строка содержит символ разделителя (--) и идентификатор сообщения. После нее следуют поля с дополнительной информацией: Subject (краткая форма сообщения, аналог записи в классическом логе), Defined-By (принадлежность сообщения), Support (ссылка на ресурс поддержки, на котором можно получить консультацию по теме сообщения), Documentation (ссылки на man, info и web-страницы с документацией по теме сообщения). После этого следует развернутое описание сообщения, которое может состоять из нескольких абзацев и содержать подстановочные шаблоны, позволяющие вставить в текст конкретного сообщения содержимое других полей журнальной записи.
Перевод таких сообщений на местные языки (помимо основного английского) реализуется очень просто: достаточно добавить запись с таким же идентификатором, и указать после него код локали. При этом можно перевести не только текст сообщения, но и указать ссылки на документацию и поддержку на родном языке.
Каталог Journal позволяет программам определять свои собственные идентификаторы в catalog-файлах, которые при установке программы нужно поместить в /usr/lib/systemd/catalog/. Поиск и сопоставление идентификаторов сообщений по каталогу производятся внутри программы journalctl при указании ключа «-x». При этом для выбранных сообщений выводятся развернутые описания.
Абстракция сообщений от текста дает целый ряд преимуществ:
- Исправление ошибки в тексте сообщения, или изменение его формулировки, больше не ломает работу различных анализаторов лога, которые ищут в нем конкретные подстроки.
- Замена повторяющихся длинных строк коротким идентификатором позволяет сэкономить место.
- Использование поиска по индексированной БД Journal работает гораздо быстрее, чем множественное сравнение строк в syslog/grep. Этот момент особенно актуален на высоконагруженных системах с большим объемом лога: поиск по индексу происходит за время, пропорциональное O(log(n)) (n — количество записей в БД), вместо O(n) в syslog/grep (что, кстати, уже давно используется в реализации подсистемы аудита классических UNIX-систем — BSM, использующей бинарный формат лога).
- Как уже упоминалось выше, значительно упрощается перевод сообщений на местные языки.
- Сообщение больше не ограничивается краткой строкой — в него можно включить полноценное текстовое описание, с указанием всех необходимых подробностей.
- Добавление полей со ссылками на поддержку и документацию упрощает работу системного администратора. В этом плане Journal является продолжением глобальной концепции systemd — самодокументированной загрузки, в соответствие с которым каждый юнит из штатной поставки systemd имеет свою man-страницу, в которой описаны его назначение, принцип работы и методы настройки. При этом ссылка на man-страницу содержится в метаданных юнита и выводится по команде systemctl status, что упрощает поиск документации.
Стоит отметить что, как и многие «новшества» systemd, этот механизм не является чем-то принципиально новым — аналогичный подход используется, например, в операционных системах для мейнфреймов, в частности, в z/OS. А в вышеописанной идее «самодокументированной загрузки» прослеживается влияние системы инициализации Solaris — SMF, позволяющей включать в метаданные службы ссылки на документацию.
© OpenNet