18.8. Отчеты об ошибках и ведение журнала#

18.8. Отчеты об ошибках и ведение журнала

18.8. Отчеты об ошибках и ведение журнала #

18.8.1. Где вести журнал #

log_destination (string) #

Tantor SE-1C поддерживает несколько методов для регистрации сообщений сервера, включая stderr, csvlog, jsonlog и syslog. На Windows также поддерживается eventlog. Установите этот параметр в список желаемых мест назначения журнала, разделенных запятыми. По умолчанию сообщения регистрируются только в stderr. Этот параметр может быть установлен только в файле postgresql.conf или в командной строке сервера.

Если включен параметр log_destination со значением csvlog, журналы выводятся в формате значений, разделенных запятыми (CSV), что удобно для загрузки журналов в программы. Подробнее см. Раздел 18.8.4. Для генерации журналов в формате CSV необходимо включить logging_collector.

Если включен параметр log_destination со значением jsonlog, записи журнала выводятся в формате JSON, что удобно для загрузки журналов в программы. См. Раздел 18.8.5 для получения подробной информации. Для генерации журнала в формате JSON необходимо включить logging_collector.

Когда включены stderr, csvlog или jsonlog, создается файл current_logfiles, в котором записывается местоположение файла(-ов) журнала, используемого в данный момент сборщиком журналов и соответствующим пунктом назначения журнала. Это предоставляет удобный способ найти журналы, используемые в данный момент экземпляром. Вот пример содержимого этого файла:

stderr log/postgresql.log
csvlog log/postgresql.csv
jsonlog log/postgresql.json

current_logfiles пересоздается при создании нового файла журнала в результате его вращения и при перезагрузке log_destination. Он удаляется, когда ни один из stderr, csvlog или jsonlog не включены в log_destination, а также когда сборщик журнала отключен.

Примечание

На большинстве Unix-систем вам потребуется изменить конфигурацию демона syslog вашей системы, чтобы воспользоваться опцией syslog для log_destination. Tantor SE-1C может записывать журнал в устройства syslog с помощью уровней LOCAL0 до LOCAL7 (см. syslog_facility), но конфигурация syslog по умолчанию на большинстве платформ будет отбрасывать все такие сообщения. Вам потребуется добавить что-то вроде:

local0.*    /var/log/postgresql

Чтобы заставить работать syslog демон, измените его конфигурационный файл.

На Windows, когда вы используете опцию eventlog для log_destination, вы должны зарегистрировать источник событий и его библиотеку в операционной системе, чтобы Windows Event Viewer мог чисто отображать сообщения журнала событий. См. Раздел 17.12 для получения подробной информации.

logging_collector (boolean) #

Этот параметр включает сборщик журналов, который является фоновым процессом, который захватывает сообщения журнала, отправленные в stderr и перенаправляет их в файлы журналов. Этот подход часто более полезен, чем запись в syslog, поскольку некоторые типы сообщений могут не появляться в выводе syslog. (Один из распространенных примеров - сообщения об ошибке динамического связывателя; другой - сообщения об ошибках, созданные сценариями, такими как archive_command). Этот параметр может быть установлен только при запуске сервера.

Примечание

Возможно вести журнал в stderr без использования сборщика журнала; сообщения журнала будут отправляться туда, куда направлен stderr сервера. Однако этот метод подходит только для низкого объема журнала, так как он не предоставляет удобного способа поворота журнальных файлов. Кроме того, на некоторых платформах неиспользование сборщика журнала может привести к потере или искажению вывода журнала, поскольку несколько процессов, одновременно пишущих в один и тот же журнальный файл, могут перезаписывать вывод друг друга.

Примечание

Коллектор журналирования разработан таким образом, чтобы никогда не терять сообщения. Это означает, что в случае чрезвычайно высокой нагрузки процессы сервера могут быть заблокированы при попытке отправить дополнительные сообщения журнала, когда коллектор отстает. В отличие от этого, syslog предпочитает отбрасывать сообщения, если не может записать их, что означает, что в таких случаях он может не записывать некоторые сообщения, но не будет блокировать остальную систему.

log_directory (string) #

Когда параметр logging_collector включен, этот параметр определяет каталог, в котором будут создаваться файлы журнала. Он может быть указан как абсолютный путь или относительно каталога данных кластера. Этот параметр может быть установлен только в файле postgresql.conf или в командной строке сервера. По умолчанию используется значение log.

log_filename (string) #

Когда параметр logging_collector включен, этот параметр устанавливает имена файлов создаваемых журналов. Значение рассматривается как шаблон strftime, поэтому можно использовать %-экранирование для указания имен файлов, изменяющихся со временем. (Обратите внимание, что если есть какие-либо зависимые от часового пояса %-экранирования, вычисление выполняется в зоне, указанной в log_timezone). Поддерживаемые %-экранирования аналогичны тем, которые перечислены в спецификации strftime Open Group. Обратите внимание, что системная функция strftime не используется напрямую, поэтому платформо-специфичные (нестандартные) расширения не работают. Значение по умолчанию - postgresql-%Y-%m-%d_%H%M%S.log.

Если вы указываете имя файла без экранирования, вам следует планировать использование утилиты для ротации журналов, чтобы избежать заполнения всего диска. В версиях до 8.4, если не было присутствовало ни одного экранирования %, Tantor SE-1C добавлял эпоху времени создания нового файла журнала, но это больше не так.

Если включен вывод в формате CSV в параметре log_destination, к имени файла журнала с добавленным временным штампом будет добавлено расширение .csv для создания имени файла для вывода в формате CSV. (Если имя файла журнала log_filename заканчивается на .log, то суффикс будет заменен).

Если включен вывод в формате JSON в параметре log_destination, к имени файла журнала с отметкой времени будет добавлено расширение .json для создания имени файла для вывода в формате JSON. (Если имя файла журнала log_filename заканчивается на .log, суффикс заменяется).

Этот параметр может быть установлен только в файле postgresql.conf или в командной строке сервера.

log_file_mode (integer) #

На Unix-системах этот параметр устанавливает права доступа для файлов журнала, когда параметр logging_collector включен. (На системах Microsoft Windows этот параметр игнорируется). Ожидается, что значение параметра будет числовым режимом, указанным в формате, принятом системными вызовами chmod и umask. (Чтобы использовать привычный восьмеричный формат, число должно начинаться с 0 (нуля).)

По умолчанию разрешения составляют 0600, что означает, что только владелец сервера может читать или записывать файлы журнала. Другая часто используемая настройка - 0640, позволяющая членам группы владельца читать файлы. Однако обратите внимание, что для использования такой настройки вам нужно изменить log_directory, чтобы хранить файлы где-то вне каталога данных кластера. В любом случае, не рекомендуется делать файлы журнала доступными для чтения всему миру, так как они могут содержать конфиденциальные данные.

Этот параметр может быть установлен только в файле postgresql.conf или в командной строке сервера.

log_rotation_age (integer) #

Когда logging_collector включен, этот параметр определяет максимальное время использования отдельного файла журнала, после которого будет создан новый файл журнала. Если это значение указано без единиц измерения, оно считается в минутах. По умолчанию установлено значение 24 часа. Установите значение ноль, чтобы отключить создание новых файлов журнала на основе времени. Этот параметр может быть установлен только в файле postgresql.conf или в командной строке сервера.

log_rotation_size (integer) #

Когда параметр logging_collector включен, этот параметр определяет максимальный размер отдельного файла журнала. После того, как в файл журнала будет записано столько данных, будет создан новый файл журнала. Если это значение указано без единиц измерения, оно считается в килобайтах. По умолчанию установлено значение 10 мегабайт. Установите значение ноль, чтобы отключить создание новых файлов журнала на основе размера. Этот параметр может быть установлен только в файле postgresql.conf или в командной строке сервера.

log_truncate_on_rotation (boolean) #

Когда параметр logging_collector включен, этот параметр заставляет Tantor SE-1C обрезать (перезаписывать), а не добавлять, любой существующий файл журнала с тем же именем. Однако обрезка произойдет только при открытии нового файла из-за временного вращения, а не при запуске сервера или при размерном вращении. Когда параметр отключен, существующие файлы будут добавляться во всех случаях. Например, использование этой настройки в сочетании с log_filename вроде postgresql-%H.log приведет к созданию двадцати четырех часовых файлов журнала, а затем циклической перезаписи их. Этот параметр может быть установлен только в файле postgresql.conf или в командной строке сервера.

Пример: Чтобы сохранить 7 дней журналов, по одному файлу журнала в день с именами server_log.Mon, server_log.Tue и т.д., и автоматически перезаписывать журнал прошлой недели журналом текущей недели, установите log_filename в server_log.%a, log_truncate_on_rotation в on и log_rotation_age в 1440.

Пример: Чтобы сохранить 24 часа журналов, по одному файлу журнала в час, но также поворачивать раньше, если размер файла журнала превышает 1 ГБ, установите log_filename в server_log.%H%M, log_truncate_on_rotation в on, log_rotation_age в 60 и log_rotation_size в 1000000. Включение %M в log_filename позволяет любым размерностно-управляемым поворотам, которые могут произойти, выбрать имя файла, отличное от начального имени файла часа.

syslog_facility (enum) #

Когда включено ведение журнала в syslog, этот параметр определяет syslog facility, который будет использоваться. Вы можете выбрать из LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7; по умолчанию используется LOCAL0. См. также документацию вашего syslog демона системы. Этот параметр может быть установлен только в файле postgresql.conf или в командной строке сервера.

syslog_ident (string) #

Когда включено ведение журнала в syslog, этот параметр определяет имя программы, используемое для идентификации сообщений Tantor SE-1C в журналах syslog. По умолчанию используется postgres. Этот параметр может быть установлен только в файле postgresql.conf или в командной строке сервера.

syslog_sequence_numbers (boolean) #

Когда выполняется вход в syslog и это включено (по умолчанию), каждое сообщение будет предваряться увеличивающимся порядковым номером (например, [2]). Это обходит подавление --- последнее сообщение повторяется N раз ---, которое выполняется по умолчанию во многих реализациях syslog. В более современных реализациях syslog можно настроить подавление повторяющихся сообщений (например, с помощью $RepeatedMsgReduction в rsyslog), поэтому это может быть необязательно. Также вы можете отключить это, если вам действительно нужно подавить повторяющиеся сообщения.

Этот параметр может быть установлен только в файле postgresql.conf или в командной строке сервера.

syslog_split_messages (boolean) #

Когда включена запись в syslog приложения, этот параметр определяет, как сообщения доставляются в syslog. По умолчанию сообщения разбиваются на строки, а длинные строки разбиваются так, чтобы они помещались в 1024 байта, что является типичным ограничением размера для традиционных реализаций syslog. Когда параметр отключен, сообщения журнала сервера PostgreSQL доставляются в службу syslog "как есть", и службе syslog предоставляется возможность справиться с потенциально громоздкими сообщениями.

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

Этот параметр может быть установлен только в файле postgresql.conf или в командной строке сервера.

event_source (string) #

Когда включено ведение журнала в журнале событий, этот параметр определяет имя программы, используемое для идентификации сообщений Tantor SE-1C в журнале. По умолчанию используется PostgreSQL. Этот параметр может быть установлен только в файле postgresql.conf или в командной строке сервера.

18.8.2. Когда вести журнал #

log_min_messages (enum) #

Управляет тем, какие уровни сообщений записываются в журнал сервера. Допустимые значения: DEBUG5, DEBUG4, DEBUG3, DEBUG2, DEBUG1, INFO, NOTICE, WARNING, ERROR, LOG, FATAL, и PANIC. Каждый уровень включает все уровни, следующие за ним. Чем позже уровень, тем меньше сообщений отправляется в журнал. Значение по умолчанию: WARNING. Обратите внимание, что здесь уровень LOG имеет другой ранг, чем в client_min_messages. Изменить эту настройку могут только суперпользователи и пользователи с соответствующими привилегиями SET.

log_min_error_statement (enum) #

Управляет записью в журнал сервера SQL-запросов, вызывающих ошибку. В журнальную запись включается текущий SQL-запрос для любого сообщения с указанным или более высоким уровнем серьезности. Допустимые значения: DEBUG5, DEBUG4, DEBUG3, DEBUG2, DEBUG1, INFO, NOTICE, WARNING, ERROR, LOG, FATAL и PANIC. По умолчанию используется значение ERROR, что означает, что будут записываться запросы, вызывающие ошибки, сообщения журнала, критические ошибки или аварийные ситуации. Чтобы отключить запись неудачных запросов, установите этот параметр в значение PANIC. Изменить это значение могут только суперпользователи и пользователи с соответствующими привилегиями SET.

log_min_duration_statement (integer) #

При установке данного параметра будет записываться длительность каждого выполненного запроса, если запрос выполнялся не менее указанного времени. Например, если установить значение 250ms, то будут записываться все SQL-запросы, которые выполняются 250 миллисекунд или дольше. Включение этого параметра может быть полезно для отслеживания неоптимизированных запросов в ваших приложениях. Если значение не указано вместе с единицами измерения, оно считается в миллисекундах. Установка значения в ноль позволяет записывать длительность всех запросов. Значение -1 (по умолчанию) отключает запись длительности запросов. Изменить этот параметр могут только суперпользователи и пользователи с соответствующими привилегиями SET.

Это переопределяет log_min_duration_sample, что означает, что запросы с продолжительностью, превышающей это значение, не подлежат выборочной обработке и всегда регистрируются.

Для клиентов, использующих расширенный протокол запросов, продолжительность шагов Parse, Bind и Execute регистрируется независимо.

Примечание

При использовании этой опции вместе с log_statement, текст операторов, которые регистрируются из-за log_statement, не будет повторяться в сообщении журнала длительности. Если вы не используете syslog, рекомендуется регистрировать PID или идентификатор сессии с помощью log_line_prefix чтобы вы могли связать сообщение оператора с последующим сообщением о длительности с помощью идентификатора процесса или сессии.

log_min_duration_sample (integer) #

Позволяет выборочно отслеживать длительность выполненных операторов, которые работали по крайней мере указанное количество времени. Это создает те же типы записей журнала, что и log_min_duration_statement, но только для подмножества выполненных операторов, с частотой выборки, контролируемой log_statement_sample_rate. Например, если установить его на 100ms, то все SQL-операторы, выполняющиеся 100 мс или дольше, будут рассматриваться для выборки. Включение этого параметра может быть полезным, когда трафик слишком высок, чтобы регистрировать все запросы. Если это значение указано без единиц измерения, оно принимается в миллисекундах. Установка этого значения в ноль выбирает все длительности операторов. -1 (по умолчанию) отключает выборку длительности операторов. Изменить это значение могут только суперпользователи и пользователи с соответствующими привилегиями SET.

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

Другие заметки для log_min_duration_statement также применяются к этой настройке.

log_statement_sample_rate (floating point) #

Определяет долю операторов с продолжительностью, превышающей log_min_duration_sample, которые будут записываться в журнал. Выборка является стохастической, например, 0.5 означает, что существует статистически одна шанс из двух, что любой заданный оператор будет записан в журнал. По умолчанию установлено значение 1.0, что означает запись всех выбранных операторов в журнал. Установка этого параметра в ноль отключает запись выбранных операторов с продолжительностью, то же самое, что установка log_min_duration_sample в -1. Изменить этот параметр могут только суперпользователи и пользователи с соответствующими привилегиями SET.

log_transaction_sample_rate (floating point) #

Устанавливает долю транзакций, все операторы которых регистрируются, в дополнение к операторам, зарегистрированным по другим причинам. Это применяется к каждой новой транзакции независимо от продолжительности ее операторов. Выборка является стохастической, например, 0.1 означает, что статистически есть один шанс из десяти, что любая данная транзакция будет зарегистрирована. log_transaction_sample_rate может быть полезен для создания выборки транзакций. По умолчанию установлено значение 0, что означает, что операторы из дополнительных транзакций не регистрируются. Установка этого значения на 1 регистрирует все операторы всех транзакций. Изменить это значение могут только суперпользователи и пользователи с соответствующими привилегиями SET.

Примечание

Как и все опции регистрации операторов, эта опция может значительно увеличить издержки.

log_startup_progress_interval (integer) #

Устанавливает время, через которое процесс запуска будет регистрировать сообщение о длительной операции, которая все еще выполняется, а также интервал между последующими сообщениями о прогрессе для этой операции. По умолчанию установлено значение 10 секунд. Значение 0 отключает эту функцию. Если это значение указано без единиц измерения, оно считается в миллисекундах. Этот параметр применяется отдельно к каждой операции. Этот параметр может быть установлен только в файле postgresql.conf или в командной строке сервера.

Например, если синхронизация каталога данных занимает 25 секунд, а затем сброс незафиксированных отношений занимает 8 секунд, и если это значение имеет значение по умолчанию в 10 секунд, то сообщения будут регистрироваться для синхронизации каталога данных после того, как она продолжается в течение 10 секунд, и снова после того, как она продолжается в течение 20 секунд, но ничего не будет регистрироваться для сброса незафиксированных отношений.

Таблица 18.2 объясняет уровни серьезности сообщений, используемые Tantor SE-1C. Если вывод журнала отправляется в syslog или eventlog Windows, уровни серьезности переводятся, как показано в таблице.

Таблица 18.2. Уровни серьезности сообщений

СерьезностьИспользованиеsyslogeventlog
DEBUG1 .. DEBUG5Предоставляет последовательно более подробную информацию для использования разработчиками.DEBUGINFORMATION
INFOПредоставляет информацию, неявно запрошенную пользователем, например, вывод от VACUUM VERBOSE.INFOINFORMATION
NOTICEПредоставляет информацию, которая может быть полезной для пользователей, например, уведомление о сокращении длинных идентификаторов.NOTICEINFORMATION
WARNINGПредоставляет предупреждения о возможных проблемах, например, COMMIT вне блока транзакции.NOTICEWARNING
ERRORСообщает об ошибке, которая привела к прерыванию текущей команды.WARNINGERROR
LOGОтчеты содержат информацию, интересующую администраторов, например, активность контрольных точек.INFOINFORMATION
FATALСообщает об ошибке, которая привела к прерыванию текущей сессии.ERRERROR
PANICСообщает об ошибке, которая привела к прерыванию всех сессий работы с базой данных.CRITERROR

18.8.3. Что записывать в журнал #

Примечание

Что вы выберете для записи в журнал, может иметь важное значение для безопасности; см. Раздел 23.3.

application_name (string) #

The application_name может быть любой строкой длиной менее NAMEDATALEN символов (64 символа в стандартной сборке). Обычно она устанавливается приложением при подключении к серверу. Имя будет отображаться в представлении pg_stat_activity и включаться в записи журнала в формате CSV. Оно также может быть включено в обычные записи журнала через параметр log_line_prefix. В значении application_name могут использоваться только печатные символы ASCII. Другие символы заменяются на шестнадцатеричные экранирования в стиле C.

debug_print_parse (boolean)
debug_print_rewritten (boolean)
debug_print_plan (boolean) #

Эти параметры позволяют выводить различную отладочную информацию. При установке они печатают полученное дерево разбора, вывод переписывателя запросов или план выполнения для каждого выполненного запроса. Эти сообщения выводятся на уровне сообщений LOG, поэтому по умолчанию они появляются в журнале сервера, но не отправляются клиенту. Вы можете изменить это, отрегулировав client_min_messages и/или log_min_messages. По умолчанию эти параметры отключены.

debug_pretty_print (boolean) #

Когда установлено, debug_pretty_print делает отступы в сообщениях, создаваемых debug_print_parse, debug_print_rewritten или debug_print_plan. Это приводит к более читабельному, но гораздо более длинному выводу, чем формат компактный, используемый, когда он отключен. По умолчанию он включен.

log_autovacuum_min_duration (integer) #

При установке этого параметра в ненулевое значение, каждое действие, выполненное автоматической очисткой, будет записываться в журнал, если оно выполнялось не менее указанного времени. Установка значения в ноль приведет к записи всех действий автоматической очистки. Значение -1 отключает запись действий автоматической очистки. Если это значение указано без единиц измерения, оно считается в миллисекундах. Например, если вы установите его в 250ms, то все операции автоматической очистки и анализы, которые выполняются 250 миллисекунд или дольше, будут записываться в журнал. Кроме того, когда этот параметр установлен в любое значение, отличное от -1, будет записываться сообщение, если действие автоматической очистки прне указано из-за конфликтующей блокировки или одновременно удаляемого отношения. Значение по умолчанию - 10min. Включение этого параметра может быть полезно для отслеживания активности автоматической очистки. Этот параметр может быть установлен только в файле postgresql.conf или в командной строке сервера; но его значение может быть переопределено для отдельных таблиц путем изменения параметров хранения таблицы.

log_checkpoints (boolean) #

Заставляет записывать в журнал сервера информацию о контрольных точках и точках перезапуска. В сообщениях журнала включены некоторые статистические данные, включая количество записанных буферов и время, затраченное на их запись. Этот параметр может быть установлен только в файле postgresql.conf или в командной строке сервера. Значение по умолчанию - включено.

log_connections (boolean) #

Заставляет каждое попытку подключения к серверу регистрироваться, а также успешное завершение аутентификации клиента (если необходимо) и авторизации. Только суперпользователи и пользователи с соответствующим привилегией SET могут изменять этот параметр при запуске сессии, и он не может быть изменен во время сессии. По умолчанию off.

Примечание

Некоторые клиентские программы, такие как psql, пытаются подключиться дважды, чтобы определить, требуется ли пароль, поэтому дублированные сообщения connection received не всегда указывают на проблему.

log_disconnections (boolean) #

Записывает в журнал завершения сессий. Журнальный вывод предоставляет информацию, аналогичную параметру log_connections, а также продолжительность сессии. Изменить этот параметр при запуске сессии могут только суперпользователи и пользователи с соответствующими привилегиями SET, и он не может быть изменен внутри сессии. По умолчанию установлено значение off.

log_duration (boolean) #

Заставляет регистрировать продолжительность каждого выполненного оператора. По умолчанию установлено значение off. Изменить это значение могут только суперпользователи и пользователи с соответствующими привилегиями SET.

Для клиентов, использующих расширенный протокол запросов, продолжительность шагов Parse, Bind и Execute регистрируется независимо.

Примечание

Разница между включением log_duration и установкой log_min_duration_statement в ноль заключается в том, что превышение значения log_min_duration_statement принуждает записывать текст запроса, но эта опция этого не делает. Таким образом, если log_duration установлен в on, а log_min_duration_statement имеет положительное значение, все длительности записываются, но текст запроса включается только для запросов, превышающих пороговое значение. Это поведение может быть полезным для сбора статистики в высоконагруженных установках.

log_error_verbosity (enum) #

Определяет количество деталей, записываемых в журнал сервера для каждого сообщения, которое записывается. Допустимые значения: TERSE, DEFAULT и VERBOSE, каждое из которых добавляет больше полей к отображаемым сообщениям. TERSE исключает запись информации об ошибках DETAIL, HINT, QUERY и CONTEXT. В вывод VERBOSE включается код ошибки SQLSTATE (см. также Предметный указатель A) и имя файла исходного кода, имя функции и номер строки, сгенерировавших ошибку. Это настройку могут изменять только суперпользователи и пользователи с соответствующими привилегиями SET.

log_hostname (boolean) #

По умолчанию, сообщения журнала подключения показывают только IP-адрес подключающегося хоста. Включение этого параметра приводит к регистрации также и имени хоста. Обратите внимание, что в зависимости от настроек разрешения имен хостов это может вызвать значительное снижение производительности. Этот параметр может быть установлен только в файле postgresql.conf или в командной строке сервера.

log_line_prefix (string) #

Эта строка в стиле printf, которая выводится в начале каждой строки журнала. Символы % начинают последовательности экранирования, которые заменяются информацией о состоянии, описанной ниже. Нераспознанные экранирования игнорируются. Остальные символы копируются прямо в строку журнала. Некоторые экранирования распознаются только сессийыми процессами и будут рассматриваться как пустые фоновыми процессами, такими как основной процесс сервера. Информация о состоянии может быть выровнена либо по левому, либо по правому краю, указав числовой литерал после % и перед опцией. Отрицательное значение приведет к заполнению информации о состоянии пробелами справа, чтобы обеспечить ей минимальную ширину, в то время как положительное значение будет заполнять слева. Заполнение может быть полезным для облегчения читаемости человеком в журнальных файлах.

Этот параметр может быть установлен только в файле postgresql.conf или в командной строке сервера. По умолчанию используется значение '%m [%p] ', которое записывает временную метку и идентификатор процесса.

ЭкранированиеЭффектТолько для сессии
%aИмя приложенияда
%uИмя пользователяда
%dИмя базы данныхда
%rИмя удаленного хоста или IP-адрес и удаленный портда
%hИмя удаленного хоста или IP-адресда
%bТип бэкенданет
%pИдентификатор процессанет
%PИдентификатор процесса группы параллельного выполнения, если этот процесс является рабочим процессом параллельного запросанет
%tВременная метка без миллисекунднет
%mВременная метка с миллисекундаминет
%nВременная метка с миллисекундами (как Unix-эпоха)нет
%iТег команды: тип текущей команды сессиида
%eSQLSTATE код ошибкинет
%cИдентификатор сессии: см. ниженет
%lНомер строки журнала для каждой сессии или процесса, начиная с 1нет
%sМетка времени начала процессанет
%vВиртуальный идентификатор транзакции (backendID/localXID); см. Раздел 71.1нет
%xИдентификатор транзакции (0, если не назначен); см. Раздел 71.1нет
%qНе выводит никакого результата, но указывает процессам, не относящимся к сессии, остановиться в этой точке строки; игнорируется процессами сессиинет
%QИдентификатор запроса текущего запроса. Идентификаторы запросов не вычисляются по умолчанию, поэтому это поле будет равно нулю, если параметр compute_query_id отключен или настроен сторонний модуль, вычисляющий идентификаторы запросов.да
%%Литерал %нет

Тип backend соответствует столбцу backend_type в представлении pg_stat_activity, но в журнале могут появиться дополнительные типы, которые не отображаются в этом представлении.

Экранирование %c печатает квази-уникальный идентификатор сессии, состоящий из двух 4-байтных шестнадцатеричных чисел (без ведущих нулей), разделенных точкой. Числа представляют собой время запуска процесса и идентификатор процесса, поэтому %c также может использоваться как способ экономии места для печати этих элементов. Например, чтобы сгенерировать идентификатор сессии из pg_stat_activity, используйте этот запрос:

SELECT to_hex(trunc(EXTRACT(EPOCH FROM backend_start))::integer) || '.' ||
       to_hex(pid)
FROM pg_stat_activity;

Подсказка

Если вы устанавливаете непустое значение для log_line_prefix, обычно следует добавить пробел в конце, чтобы создать визуальное разделение от остальной части строки журнала. Можно использовать и знаки пунктуации.

Подсказка

Syslog создает свою собственную метку времени и информацию о идентификаторе процесса, поэтому, вероятно, вам не следует включать эти экранирования, если вы ведете журнал в syslog.

Подсказка

Экранирование %q полезно при включении информации, доступной только в контексте сессии (бэкенда), такой как имя пользователя или базы данных. Например:

log_line_prefix = '%m [%p] %q%u@%d/%a '

Примечание

Всегда используйте экранирование %Q для вывода нулевого идентификатора для строк, выводимых log_statement, потому что log_statement генерирует вывод до того, как идентификатор может быть рассчитан, включая недопустимые операторы, для которых идентификатор не может быть рассчитан.

log_lock_waits (boolean) #

Управляет выводом сообщения в журнал, когда сессия ожидает дольше, чем deadlock_timeout, чтобы получить блокировку. Это полезно для определения, вызывают ли ожидания блокировки плохую производительность. По умолчанию установлено значение off. Изменить это значение могут только суперпользователи и пользователи с соответствующими привилегиями SET.

log_recovery_conflict_waits (boolean) #

Определяет, будет ли создаваться сообщение в журнале, когда процесс запуска ожидает дольше, чем deadlock_timeout, из-за конфликтов восстановления. Это полезно для определения, мешают ли конфликты восстановления применению WAL.

По умолчанию значение параметра off. Этот параметр может быть установлен только в файле postgresql.conf или в командной строке сервера.

log_parameter_max_length (integer) #

Если значение больше нуля, то каждое значение параметра связывания, зарегистрированное в сообщении журналирования, не являющемся сообщением об ошибке, обрезается до указанного количества байтов. Значение ноль отключает регистрацию параметров связывания в журналах сообщений, не являющихся сообщениями об ошибках. Значение -1 (по умолчанию) позволяет регистрировать параметры связывания полностью. Если это значение указано без единиц измерения, оно считается в байтах. Изменить это значение могут только суперпользователи и пользователи с соответствующими привилегиями SET.

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

log_parameter_max_length_on_error (integer) #

Если значение больше нуля, то каждое значение параметра связывания, указанное в сообщениях об ошибках, будет обрезано до указанного количества байтов. Значение ноль (по умолчанию) отключает включение параметров связывания в сообщения об ошибках. Значение -1 позволяет печатать параметры связывания полностью. Если это значение указано без единиц измерения, оно считается в байтах.

Значения этой настройки, отличные от нуля, увеличивают издержки, так как Tantor SE-1C должен будет хранить текстовые представления значений параметров в памяти в начале каждого оператора, независимо от того, произойдет ли в конечном итоге ошибка. Издержки больше, когда параметры связывания отправляются в двоичной форме, чем когда они отправляются в виде текста, так как в первом случае требуется преобразование данных, в то время как во втором случае требуется только копирование строки.

log_statement (enum) #

Определяет, какие SQL-запросы будут записываться в журнал. Допустимые значения: none (выключено), ddl, mod и all (все запросы). ddl записывает все операторы определения данных, такие как CREATE, ALTER и DROP. mod записывает все операторы ddl, а также операторы модификации данных, такие как INSERT, UPDATE, DELETE, TRUNCATE и COPY FROM. Операторы PREPARE, EXECUTE и EXPLAIN ANALYZE также записываются в журнал, если их внутренний оператор соответствует подходящему типу. Для клиентов, использующих расширенный протокол запросов, запись в журнал происходит при получении сообщения Execute, и значения параметров связывания (Bind) включаются (с удвоенными апострофами).

По умолчанию установлено значение none. Изменить это значение могут только суперпользователи и пользователи с соответствующими привилегиями SET.

Примечание

Запросы, содержащие простые синтаксические ошибки, не регистрируются даже при установке log_statement = all, поскольку сообщение в журнал выводится только после базового анализа для определения типа запроса. В случае расширенного протокола запроса, эта настройка также не регистрирует запросы, которые не проходят в фазе выполнения (т.е. во время анализа или планирования разбора). Установите log_min_error_statement на значение ERROR (или ниже), чтобы регистрировать такие запросы.

Зарегистрированные операторы могут раскрывать чувствительные данные и даже содержать пароли в виде обычного текста.

log_replication_commands (boolean) #

Сохраняет все команды репликации в журнале сервера. См. Раздел 52.4 для получения дополнительной информации о командах репликации. Значение по умолчанию - off. Изменить это значение могут только суперпользователи и пользователи с соответствующими привилегиями SET.

log_temp_files (integer) #

Управляет ведением журнала имен и размеров временных файлов. Временные файлы могут быть созданы для сортировок, хешей и временных результатов запросов. Если эта настройка включена, запись в журнал создается для каждого временного файла, с указанием размера файла в байтах, когда он удаляется. Значение ноль регистрирует всю информацию о временных файлах, в то время как положительные значения регистрируют только файлы, размер которых больше или равен указанному объему данных. Если это значение указано без единиц измерения, оно принимается за килобайты. Настройка по умолчанию -1, что отключает такое ведение журнала. Только суперпользователи и пользователи с соответствующими привилегиями SET могут изменить эту настройку.

log_timezone (string) #

Устанавливает часовой пояс, используемый для временных меток, записываемых в журнал сервера. В отличие от TimeZone, это значение является глобальным для кластера, чтобы все сессии сообщали временные метки последовательно. Встроенное значение по умолчанию - GMT, но обычно оно переопределяется в postgresql.conf; initdb установит соответствующую настройку в соответствии с системной средой. См. Раздел 8.5.3 для получения дополнительной информации. Этот параметр может быть установлен только в файле postgresql.conf или в командной строке сервера.

18.8.4. Использование вывода журнала в формате CSV #

Включение csvlog в список log_destination предоставляет удобный способ импорта файлов журнала в таблицу базы данных. Этот параметр выводит строки журнала в формате, разделенном запятыми (CSV), со следующими столбцами: метка времени с миллисекундами, имя пользователя, имя базы данных, идентификатор процесса, хост:номер порта клиента, идентификатор сессии, номер строки для каждой сессии, тег команды, время начала сессии, виртуальный идентификатор транзакции, обычный идентификатор транзакции, уровень серьезности ошибки, код SQLSTATE, сообщение об ошибке, детали сообщения об ошибке, подсказка, внутренний запрос, который привел к ошибке (если есть), количество символов ошибочной позиции в нем, контекст ошибки, пользовательский запрос, который привел к ошибке (если включен параметр log_min_error_statement), количество символов ошибочной позиции в нем, местоположение ошибки в исходном коде PostgreSQL (если параметр log_error_verbosity установлен в verbose), имя приложения, тип бэкенда, идентификатор процесса лидера параллельной группы и идентификатор запроса. Вот пример определения таблицы для хранения вывода журнала в формате CSV:

CREATE TABLE postgres_log
(
  log_time timestamp(3) with time zone,
  user_name text,
  database_name text,
  process_id integer,
  connection_from text,
  session_id text,
  session_line_num bigint,
  command_tag text,
  session_start_time timestamp with time zone,
  virtual_transaction_id text,
  transaction_id bigint,
  error_severity text,
  sql_state_code text,
  message text,
  detail text,
  hint text,
  internal_query text,
  internal_query_pos integer,
  context text,
  query text,
  query_pos integer,
  location text,
  application_name text,
  backend_type text,
  leader_pid integer,
  query_id bigint,
  PRIMARY KEY (session_id, session_line_num)
);

Чтобы импортировать файл журнала в эту таблицу, используйте команду COPY FROM:

COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;

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

Есть несколько вещей, которые вам нужно сделать, чтобы упростить импорт CSV-файлов журналов:

  1. Установите переменные log_filename и log_rotation_age, чтобы обеспечить последовательную и предсказуемую схему именования ваших файлов журналов. Это позволяет предсказать имя файла и знать, когда отдельный файл журнала завершен и готов к импорту.

  2. Установите log_rotation_size в 0, чтобы отключить разделение журнала на основе размера, так как это делает имя файла журнала трудно предсказуемым.

  3. Установите log_truncate_on_rotation в значение on, чтобы старые данные журнала не смешивались с новыми в одном файле.

  4. Определение таблицы выше включает спецификацию первичного ключа. Это полезно для защиты от случайного импорта одной и той же информации дважды. Команда COPY коммитит все импортированные данные одновременно, поэтому любая ошибка приведет к сбою всего импорта. Если вы импортируете частичный файл журнала и позже импортируете файл снова, когда он будет завершен, нарушение первичного ключа приведет к сбою импорта. Дождитесь завершения и закрытия журнала перед импортом. Эта процедура также защитит от случайного импорта неполной строки, которая еще не была полностью записана, что также приведет к сбою COPY.

18.8.5. Использование вывода журнала в формате JSON #

Включение jsonlog в список log_destination предоставляет удобный способ импортировать файлы журналов во множество различных программ. Эта опция выводит строки журнала в формате JSON.

Строковые поля со значением null исключаются из вывода. В будущем могут быть добавлены дополнительные поля. Пользовательские приложения, обрабатывающие вывод в формате jsonlog, должны игнорировать неизвестные поля.

Каждая строка журнала сериализуется в виде JSON-объекта с набором ключей и их соответствующих значений, показанных в Таблица 18.3.

Таблица 18.3. Ключи и значения записей журнала JSON

Имя ключаТипОписание
timestampстрокаВременная метка с миллисекундами
userстрокаИмя пользователя
dbnameстрокаИмя базы данных
pidномерИдентификатор процесса
remote_hoststringУдаленный хост
remote_portnumberПорт клиента
session_idstringИдентификатор сессии
line_numномерНомер строки в рамках сессии
psстрокаТекущее отображение ps
session_startstringВремя начала сессии
vxidстрокаВиртуальный идентификатор транзакции
txidстрокаОбычный идентификатор транзакции
error_severitystringСерьезность ошибки
state_codeстрокакод SQLSTATE
messageстрокаСообщение об ошибке
detailстрокаДетальное сообщение об ошибке
hintстрокаПодсказка сообщения об ошибке
internal_queryстрокаВнутренний запрос, который привел к ошибке
internal_positionnumberИндекс курсора во внутреннем запросе
contextстрокаКонтекст ошибки
statementстрокаСтрока запроса, предоставленная клиентом
cursor_positionnumberИндекс курсора в строке запроса
func_nameстрокаИмя функции местоположения ошибки
filenameстрокаИмя файла ошибки
file_line_numnumberНомер строки файла ошибки
application_nameстрокаИмя клиентского приложения
backend_typestringТип бэкенда
leader_pidnumberИдентификатор процесса лидера для активных параллельных рабочих процессов
query_idnumberИдентификатор запроса

18.8.6. Заголовок процесса #

Эти настройки управляют тем, как изменяются заголовки процессов сервера. Заголовки процессов обычно просматриваются с помощью программ, таких как ps или, в Windows, Process Explorer. См. Раздел 26.1 для получения подробной информации.

cluster_name (string) #

Устанавливает имя, которое идентифицирует этот кластер баз данных (экземпляр) для различных целей. Имя кластера отображается в заголовке процесса для всех серверных процессов в этом кластере. Более того, это имя по умолчанию для подключения в режиме ожидания (см. synchronous_standby_names).

Имя может быть любой строкой длиной менее NAMEDATALEN символов (64 символа в стандартной сборке). В значении cluster_name могут использоваться только печатные символы ASCII. Другие символы заменяются на шестнадцатеричные экранирования в стиле C. Имя не отображается, если этот параметр установлен в пустую строку '' (что является значением по умолчанию). Этот параметр может быть установлен только при запуске сервера.

update_process_title (boolean) #

Позволяет обновлять заголовок процесса каждый раз, когда сервер получает новую SQL-команду. По умолчанию это значение установлено на on на большинстве платформ, но на Windows по умолчанию оно установлено на off из-за большей нагрузки на эту платформу при обновлении заголовка процесса. Изменить это значение могут только суперпользователи и пользователи с соответствующими привилегиями SET.