Логирование
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 |
Время, когда запись была добавлена в лог. Пример: |
2 |
user_name |
varchar(100) |
Имя пользователя базы данных. Примеры: |
3 |
database_name |
varchar(100) |
Имя базы данных. Примеры: |
4 |
process_id |
varchar(10) |
Идентификатор системного процесса (с префиксом Пример: |
5 |
thread_id |
varchar(50) |
Идентификатор потока (с префиксом Пример: |
6 |
remote_host |
varchar(100) |
На мастере возвращает IP-адрес клиентского хоста. На сегментах возвращает IP-адрес мастер-хоста. Примеры: |
7 |
remote_port |
varchar(10) |
Значение удаленного порта. Пример: |
8 |
session_start_time |
timestamp with time zone |
Время начала сессии |
9 |
transaction_id |
int |
Идентификатор транзакции верхнего уровня на мастере. Этот идентификатор является родителем любых подтранзакций. На сегментах идентифицирует локальную транзакцию, участвующую в распределенной транзакции |
10 |
gp_session_id |
text |
Идентификатор сессии (с префиксом |
11 |
gp_command_count |
text |
Количество команд, которые мастер получил от клиента (с префиксом Пример: |
12 |
gp_segment |
text |
Идентификатор сегмента (content).
Имеет префикс Примеры: |
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) |
Уровень критичности события. Примеры: |
18 |
sql_state_code |
varchar(10) |
Код состояния SQL для данного сообщения. Пример: |
19 |
event_message |
text |
Текст лога или сообщения об ошибке. Примеры: |
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 |
Файл исходного кода, в котором было создано сообщение. Пример: |
29 |
file_line |
int |
Строка файла исходного кода, в котором было создано сообщение. Пример: |
30 |
stack_trace |
text |
Текст стека вызовов, связанный с этим сообщением |