GitHub

Логирование

Андрей Аксенов

Greengage DB может логировать различные события, включая запуск и завершение работы СУБД, сбои сегментов, попытки подключения, операции с данными и многое другое. Мониторинг этих логов помогает выявлять потенциальные угрозы безопасности. Например, вы можете отслеживать, кто и когда создал новых пользователей.

Эта статья описывает, как настроить ведение логов с различным уровнем детализации и как просматривать логи, соответствующие определенным критериям.

Обзор

Расположение лог-файлов

Логи сохраняются в кастомном формате, который использует значения, разделенные запятыми (CSV). Утилита gplogfilter позволяет просматривать и фильтровать логи.

Мастер-хост и сегмент-хосты хранят лог-файлы в следующих местах:

  • Мастер-хост

    На мастер-хосте логи хранятся в каталоге $MASTER_DATA_DIRECTORY/pg_log. По умолчанию утилита gplogfilter использует этот путь, если лог-файл не указан.

  • Сегмент-хосты

    На сегмент-хостах логи сохраняются в каталогах /<data_dir>/primary/gpseg<N>/pg_log и /<data_dir>/mirror/gpseg<N>/pg_log. Например, на сегмент-хосте sdw1, инициализированном в статье Инициализация СУБД, логи находятся в следующих местах:

    • основные сегменты: /data1/primary/gpseg0/pg_log, /data1/primary/gpseg1/pg_log;

    • зеркальные сегменты: /data1/mirror/gpseg2/pg_log, /data1/mirror/gpseg3/pg_log.

ПРИМЕЧАНИЕ

По умолчанию логи, создаваемые административными утилитами, такими как gpinitsystem, gpstart и gpconfig, сохраняются в каталоге ~/gpAdminLogs административного пользователя Greengage DB.

Примеры записей в логах

Ниже приведены несколько примеров записей в логах в формате, используемом gplogfilter:

  • Указывает, что мастер-экземпляр (seg-1) запущен и готов принимать клиентские подключения:

    2025-02-28 07:20:22.057160 UTC|||p1539|th1004996736||||0|||seg-1|||||LOG: |00000|database system is ready to accept connections|PostgreSQL 9.4.26 (Greengage Database 6.28.0 build dev) on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit compiled on Jan 28 2025 14:24:22||||||0||postmaster.c|3406|
  • Показывает, что пользователь gpadmin подключился локально с использованием сокета домена Unix и создал базу данных crm:

    2025-02-28 07:22:42.388447 UTC|gpadmin|postgres|p2062|th-1924802432|[local]||2025-02-28 07:22:08 UTC|0|con26|cmd9|seg-1||||sx1|LOG: |00000|statement: CREATE DATABASE crm;||||||CREATE DATABASE crm;|0||postgres.c|1688|
  • Показывает успешное подключение пользователя alice к базе данных crm с удаленного хоста с IP-адресом 192.168.10.55:

    2025-02-28 07:23:46.030259 UTC|alice|crm|p2069|th-1924802432|192.168.10.55|49206|2025-02-28 07:23:45 UTC|0|con30||seg-1||||sx1|LOG: |00000|connection authorized: user=alice database=crm|||||||0||postinit.c|329|

Параметры конфигурации логирования

Конфигурация логирования управляется параметрами, названия которых начинаются с log_ или gp_log_. Вы можете изменить значения параметров по умолчанию, как описано в разделе Настройка логирования.

Следующие разделы группируют важные параметры конфигурации логирования по соответствующим категориям.

Уровни логирования и детализации

  • log_min_messages — позволяет задать уровень критичности сообщений, записываемых в лог-файлы. Возможные значения включают INFO, WARNING, FATAL и другие.

  • log_error_verbosity — управляет уровнем детализации сообщений в логе. Возможные значения включают DEFAULT, TERSE и VERBOSE.

  • log_statement — управляет тем, какие SQL-запросы записываются в лог. Например, можно включить логирование только DDL-запросов. Возможные значения включают NONE, DDL, MOD и ALL.

Клиентские подключения

  • log_connections и log_disconnections — определяют, нужно ли логировать подключения и отключения клиентов.

  • log_hostname — определяет, добавлять ли имя хоста клиента в сообщения логов подключений. В зависимости от конфигурации разрешения имен хостов, включение этого параметра может привести к заметному снижению производительности.

Статистика производительности

  • log_statement_stats — записывает общую статистику производительности парсера запросов, планировщика и исполнителя в лог-файл сервера для каждого SQL-запроса.

  • log_parser_stats — записывает статистику производительности парсера запросов в лог-файл сервера для каждого SQL-запроса.

  • log_planner_stats — записывает статистику производительности Postgres-планировщика в лог-файл сервера для каждого SQL-запроса.

Ротация лог-файлов

  • log_rotation_size — устанавливает максимальный размер лог-файла перед его ротацией. Когда размер файла достигает указанного значения, он закрывается и создается новый лог-файл.

  • log_rotation_age — устанавливает максимальный возраст лог-файла перед его ротацией. Как только с момента создания файла проходит указанное время, создается новый лог-файл. По умолчанию ротация логов происходит каждые 24 часа.

Настройка логирования

Для изменения параметров конфигурации логирования используйте команду gpconfig -c. Ниже приведены несколько примеров изменения значений по умолчанию для некоторых параметров логирования:

  • Включить логирование клиентских подключений на мастере:

    $ gpconfig -c log_connections -v 'on' --masteronly
  • Настроить мастер на логирование только DDL-операций (таких как CREATE, ALTER или DROP):

    $ gpconfig -c log_statement -v 'ddl' --masteronly
  • Установить максимальный размер лог-файла перед его ротацией в 256 МБ для всего кластера Greengage DB:

    $ gpconfig -c log_rotation_size -v 256MB

Чтобы применить изменения, перезагрузите конфигурацию или перезапустите кластер с помощью gpstop. Например, для log_connections и log_statement достаточно перезагрузки конфигурации, в то время как изменение gp_log_format требует перезапуска кластера:

$ gpstop -u
$ gpstop -ra

Просмотр логов

Для просмотра логов используйте утилиту gplogfilter. По умолчанию эта утилита выполняет поиск в лог-файлах мастера Greengage DB в каталоге, определяемом переменной окружения MASTER_DATA_DIRECTORY.

ПРИМЕЧАНИЕ

Административная схема gp_toolkit предоставляет набор представлений gp_log_*, которые позволяют просматривать серверные логи с помощью SQL-запросов.

Фильтрация логов

Примеры ниже показывают, как фильтровать лог-файлы мастера.

  • Показать записи ERROR, FATAL или PANIC:

    $ gplogfilter --trouble
  • Показать последние 10 записей в логе:

    $ gplogfilter --tail 10
  • Показать события за указанный период:

    $ gplogfilter --begin '2025-02-28 07:20' --end '2025-02-28 07:30'
  • Показать все сообщения из лога за последние 10 минут:

    $ gplogfilter --duration :10
  • Выбрать только определенные столбцы:

    $ gplogfilter --columns '2,3,19'

    Посмотреть соответствие номеров колонок и их названий можно в разделе Формат логов.

  • Выбрать только записи, содержащие определенную строку:

    $ gplogfilter --find 'connection authorized'
  • Выполнить поиск записей, соответствующих указанному регулярному выражению:

    $ gplogfilter --match 'connection authorized:.*database=crm'

Настройки ввода и вывода

Примеры ниже демонстрируют, как записать вывод gplogfilter в файл и прочитать определенные лог-файлы.

  • Записать вывод в файл masterlog.out вместо стандартного вывода (stdout):

    $ gplogfilter --end '2025-02-28 07:30' --out masterlog.out
  • Сжать результирующий файл с использованием указанного уровня сжатия:

    $ gplogfilter --end '2025-02-28 07:30' --out masterlog.out --zip=7
  • Прочитать лог-файл masterlog.out:

    $ gplogfilter masterlog.out
  • Прочитать сжатый лог-файл:

    $ gplogfilter masterlog.out.gz --unzip

Просмотр логов на сегментах

Чтобы читать лог-файлы на сегмент-хостах, используйте утилиту gpssh. Следующая команда:

  • запускает gplogfilter на всех сегмент-хостах, указанных в файле hostfile_segment_hosts;

  • фильтрует логи, показывая только сообщения ERROR, FATAL или PANIC;

  • записывает результат в файл seglog.out.

$ gpssh -f hostfile_segment_hosts -e " \
      source /usr/local/gpdb/greengage_path.sh && \
      gplogfilter /data1/*/*/pg_log/gpdb*.csv \
      --trouble \
  " > seglog.out

Формат логов

Номер поля Имя поля Тип данных Описание

1

event_time

timestamp with time zone

Время, когда запись была добавлена в лог.

Пример: 2025-02-28 07:22:42.388447 UTC

2

user_name

varchar(100)

Имя пользователя базы данных.

Примеры: gpadmin, alice

3

database_name

varchar(100)

Имя базы данных.

Примеры: postgres, crm

4

process_id

varchar(10)

Идентификатор системного процесса (с префиксом p).

Пример: p2062

5

thread_id

varchar(50)

Идентификатор потока (с префиксом th).

Пример: th-1924802432

6

remote_host

varchar(100)

На мастере возвращает IP-адрес клиентского хоста. На сегментах возвращает IP-адрес мастер-хоста.

Примеры: 192.168.10.55, [local]

7

remote_port

varchar(10)

Значение удаленного порта.

Пример: 49206

8

session_start_time

timestamp with time zone

Время начала сессии

9

transaction_id

int

Идентификатор транзакции верхнего уровня на мастере. Этот идентификатор является родителем любых подтранзакций. На сегментах идентифицирует локальную транзакцию, участвующую в распределенной транзакции

10

gp_session_id

text

Идентификатор сессии (с префиксом con)

11

gp_command_count

text

Количество команд, которые мастер получил от клиента (с префиксом cmd).

Пример: cmd9

12

gp_segment

text

Идентификатор сегмента (content). Имеет префикс seg для основных сегментов или mir для зеркальных сегментов. Идентификатор сегмента для мастера всегда имеет значение -1.

Примеры: seg-1, seg1

13

slice_id

text

Идентификатор слайса (slice), указывающий на часть плана выполняемого запроса

14

distr_tranx_id

text

Идентификатор распределенной транзакции

15

local_tranx_id

text

Идентификатор локальной транзакции

16

sub_tranx_id

text

Идентификатор подтранзакции

17

event_severity

varchar(10)

Уровень критичности события.

Примеры: LOG, ERROR, FATAL

18

sql_state_code

varchar(10)

Код состояния SQL для данного сообщения.

Пример: 00000

19

event_message

text

Текст лога или сообщения об ошибке.

Примеры: statement: CREATE DATABASE crm;, connection authorized: user=alice database=crm

20

event_detail

text

Текст сообщения с деталями ошибки или предупреждения

21

event_hint

text

Текст подсказки, связанный с ошибкой или предупреждением

22

internal_query

text

Текст запроса, сгенерированный системой

23

internal_query_pos

int

Позиция курсора в автоматически сгенерированном тексте запроса

24

event_context

text

Контекст, в котором создано данное сообщение

25

debug_query_string

text

Пользовательская строка запроса с полной информацией для отладки

26

error_cursor_pos

int

Позиция курсора в строке запроса

27

func_name

text

Функция, в которой сгенерировано данное сообщение

28

file_name

text

Файл исходного кода, в котором было создано сообщение.

Пример: postgres.c

29

file_line

int

Строка файла исходного кода, в котором было создано сообщение.

Пример: 1688

30

stack_trace

text

Текст стека вызовов, связанный с этим сообщением