Лоуренц Альб. Журналирование Syslog с использованием journald в PostgreSQL

Источник: Laurenz Albe. Syslog logging with journald in PostgreSQL 2024-04

Содержание

Введение

Журналирование в syslog - далеко не новая функция PostgreSQL. Однако не так много людей используют её, поэтому вводное руководство может оказаться полезным. Поскольку в настоящее время дистрибутивы Linux для журналирования обычно используют journald, я сосредоточусь на нём.

Терминология Syslog

В настоящее время Syslog - это фактический стандарт в системах Unix. Демон syslog принимает сообщения от процессов и обрабатывает их в соответствии с его конфигурацией.

Каждое сообщение syslog снабжается средством (типом системы) и важностью. Существует несколько предопределённых средств, таких как kernel, mail или security, но нет подходящих для PostgreSQL или баз данных. Однако существуют средства от local0 до local7 предназначенные для использования под другие нужды и для PostgreSQL мы будем использовать их. При журналировании PostgreSQL через syslog важность определяется по этой таблице:

Уровень сообщений PostgreSQL Важность Syslog
DEBUG5 debug
DEBUG4 debug
DEBUG3 debug
DEBUG2 debug
DEBUG1 debug
LOG info
INFO info
NOTICE notice
WARNING notice
ERROR warning
FATAL err
PANIC crit

Syslog и journald

В настоящее время большинство дистрибутивов Linux использует systemd для большинства задач управления операционной системой:

  • выступает в роли процесса init (процесс 1, который запускает все остальные процессы)
  • для автозапуска и управления сервисами системы (такими, как PostgreSQL)
  • для журналирования

Демон systemd для журналирования - это journald. В нём реализован API syslog, поэтому его можно использовать с PostgreSQL. Я опишу журналирование через journald в продолжении этой статьи, хотя настройки PostgreSQL одинаковы для любой реализации syslog. journald предназначен для локального журналирования в пределах одного компьютера. Если нужно собирать все журналы в централизованную систему, стоит воспользоваться для этого systemd.

Настройка PostgreSQL для журналирования через syslog

Настройка PostgreSQL с одной стороны проста: всё, что нужно, это отредактировать postgresql.conf и задать значения опций.

log_destination = 'syslog'
# Значение "on" используется, если PostgreSQL пишет журнал в файл
logging_collector = off
# Значение по умолчанию - "local0"
syslog_facility = 'local0'
# Значение по умолчанию - "postgres"
syslog_ident = postgres
# Нет смысла помещать в журнал время и идентификатор процесса
# (systemd журналирует их в любом случае),
# но журналировать пользователя и базу данных может оказаться полезно
log_line_prefix = '%q%u@%d '

А затем перезагрузить PostgreSQL (если вы изменили logging_collector, то требуется перезапуск).

Если на компьютере работает больше одного кластера PostgreSQL, то для каждого из них стоит использовать разные значения syslog_ident и syslog_facility. Это позволит просматривать журналы каждого из кластеров раздельно.

Просмотр сообщений journald

Просматривать сообщения journald можно при помощи команды journalctl. Чтобы увидеть последние 20 сообщений можно воспользоваться следующей командой:

journalctl --facility=local0 -n 20

Другие полезные опции:

Короткая опция Длинная опция Описание
-t postgres --identifier=postgres Показать только сообщения с идентификатором postgres (полезно в случае нескольких кластеров с разными идентификаторами)
-S 09:00:00 --since=09:00:00 Показать только сообщения после 9 утра (если нужна другая дата, можно указать её так: -S '2024-03-13 09:00:00')
-S today --since=today Показать только сообщения с полуночи
-S -1h --since=-1h Показать сообщения только за последний час
-p warning --priority=warning Показать сообщения только ERROR, FATAL и PANIC
-g 'syntax error' --grep='syntax error' Показать только совпадающие сообщения (поддерживаются регулярные выражения Perl)
-f --follow Непрерывно выводить сообщения по мере их поступления до тех пор, пока команда не будет прервана (как tail -f)

Journald и права доступа

Журнал PostgreSQL содержит конфиденциальную информацию: он может содержать SQL-запросы и их параметры, которыми могут быть пароли. Поэтому важно защитить журнал PostgreSQL от несанкционированного доступа. В случае с journald сделать это просто: journalctl позволяет смотреть журнал только членам определённой группы операционной системы. В моём Linux Fedora 39 это группы adm, systemd-journal и wheel, но в случае других дистрибутивов они могут быть другими.

Также стоит проверить права доступа того места, где journald хранит данные. В моей системе они находятся в /var/log/journal и читать её могут только пользователи из группы systemd-journal.

Производительность и управление местом в journald

Известно, что журналирование может вызывать проблемы с производительностью. Это касается также и журналирования через syslog, поскольку PostgreSQL отправляет в демон syslog все сообщения. Однако, journald ограничивает количество сохраняемых сообщений и отбрасывает некоторые сообщения, если объём оказывается слишком большим. Таким образом ограничивается чрезмерное журналирование.

journald также ограничивает рост файлов журналов. В файле /etc/systemd/journald.conf можно настроить, насколько могут вырастать журналы. Таким образом легко предотвратить заполнение диска.

Заключение

Журналирование syslog в PostgreSQL легко настроить. Если journald установлен на компьютере, больше ничего делать не нужно. journalctl со многими его опциями делает чтение журналов более удобным по сравнению с традиционными файлами журналов. Пока я писал эту статью, я переключил свой PostgreSQL на журналирование в syslog и не вижу причин возвращаться.