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