Лоуренц Альб. Журналирование 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 и не вижу причин возвращаться.