Thread: [pgsql-ru-general] Запись логов в сокет вместо файла?

Всем привет.

Понадобилось логировать обращения к определённым полям определённых
таблиц. Именно SELECT.

Всё, что нашёл по этому поводу - включить запись всех команд в сислог.
Но у сислога есть одна особенность - он может выкинуть лишнее при
слишком высокой нагрузке. А по полученному ТЗ - "пусть мир подождёт".

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

Первый эксперимент не удался. Не пришло ничего вообще.
Если меняю log_destination = 'syslog' то все команды логируются.

сен 01 10:51:51 sandbox postgres[10271]: [4-1] СООБЩЕНИЕ:  оператор:
select manana from kukara4a;
сен 01 10:51:51 sandbox postgres[10271]: [5-1] СООБЩЕНИЕ:
продолжительность: 1.051 мс

Поэтому прошу помощи и совета - или я желаю странного, или оно как-то по
хитрому может быть включено?

//Дмитрий

Настройки:

         log_destination = 'csvlog'
         log_filename = '/tmp/access.pglog.sock'
         logging_collector = on
         log_statement = 'all'
         log_min_error_statement = 'info'
         log_min_duration_statement = 0
         log_lock_waits = on
         log_rotation_size = 0
         logging_collector = on

Скриптик:

#!/usr/bin/env ruby
# encoding: UTF-8
socket_name = ARGV[0] || '/tmp/access.pglog.sock'
begin
   File.unlink socket_name
rescue
end

require 'socket'
require 'syslog/logger'
log ||= Syslog::Logger.new 'access.pglog'

server = UNIXServer.new socket_name
File.chmod 0777, socket_name
loop do
   socket = server.accept
   while line = socket.readline
     log.info line # дада, пишем в сислог.
                   # тут на самом деле несколько регулярок
   end
end
socket.close


[pgsql-ru-general] Re: [pgsql-ru-general] Запись логов в сокет вместо файла?

From
Виктор Вислобоков
Date:
Но во-первых, syslog'ом может прикинутся и graylog, например, на удалённом хосте.
А во-вторых, если вам не нужны логи прямо в реалтайме, то почему нельзя просто запускать по крону скрипт скажем раз в минуту, который парсит лог, который пишет PostgreSQL (сохраняя последнюю позицию и начиная с неё в следующий раз) и достаёт из этого лога только то, что вам нужно?

1 сентября 2017 г., 10:53 пользователь Д.П. <aspamkiller@yandex.ru> написал:
Всем привет.

Понадобилось логировать обращения к определённым полям определённых таблиц. Именно SELECT.

Всё, что нашёл по этому поводу - включить запись всех команд в сислог.
Но у сислога есть одна особенность - он может выкинуть лишнее при слишком высокой нагрузке. А по полученному ТЗ - "пусть мир подождёт".

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

Первый эксперимент не удался. Не пришло ничего вообще.
Если меняю log_destination = 'syslog' то все команды логируются.

сен 01 10:51:51 sandbox postgres[10271]: [4-1] СООБЩЕНИЕ:  оператор: select manana from kukara4a;
сен 01 10:51:51 sandbox postgres[10271]: [5-1] СООБЩЕНИЕ: продолжительность: 1.051 мс

Поэтому прошу помощи и совета - или я желаю странного, или оно как-то по хитрому может быть включено?

//Дмитрий

Настройки:

        log_destination = 'csvlog'
        log_filename = '/tmp/access.pglog.sock'
        logging_collector = on
        log_statement = 'all'
        log_min_error_statement = 'info'
        log_min_duration_statement = 0
        log_lock_waits = on
        log_rotation_size = 0
        logging_collector = on

Скриптик:

#!/usr/bin/env ruby
# encoding: UTF-8
socket_name = ARGV[0] || '/tmp/access.pglog.sock'
begin
  File.unlink socket_name
rescue
end

require 'socket'
require 'syslog/logger'
log ||= Syslog::Logger.new 'access.pglog'

server = UNIXServer.new socket_name
File.chmod 0777, socket_name
loop do
  socket = server.accept
  while line = socket.readline
    log.info line # дада, пишем в сислог.
                  # тут на самом деле несколько регулярок
  end
end
socket.close


--
Sent via pgsql-ru-general mailing list (pgsql-ru-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-ru-general

2017-09-01 0:53 GMT-07:00 Д.П. <aspamkiller@yandex.ru>:
Всем привет.

Понадобилось логировать обращения к определённым полям определённых таблиц. Именно SELECT.


Посмотрите https://github.com/pgaudit/pgaudit. Кстати, на Amazon RDS включили не так давно в список расширений, т.е. можно там быстро поиграться для начала.

Кроме ТЗ есть ещё и суровая реальность. А в ней логирование всех команд будет давать размёр логов примерно в 50 гигов в сутки. Кроме того, что эта инфа вся не нужна, её ещё и много, там же и другие сообщения плюс к ним сыпятся. Поэтому хотелось лишнее выкидывать сразу, без записи в файл и отправлять на удалённый сислог, где всё.

Про graylog ничего не знаю, посмотрю на него, спасибо.

//ДП

01.09.2017 11:04, Виктор Вислобоков пишет:
Но во-первых, syslog'ом может прикинутся и graylog, например, на удалённом хосте.
А во-вторых, если вам не нужны логи прямо в реалтайме, то почему нельзя просто запускать по крону скрипт скажем раз в минуту, который парсит лог, который пишет PostgreSQL (сохраняя последнюю позицию и начиная с неё в следующий раз) и достаёт из этого лога только то, что вам нужно?

1 сентября 2017 г., 10:53 пользователь Д.П. <aspamkiller@yandex.ru> написал:
Всем привет.

Понадобилось логировать обращения к определённым полям определённых таблиц. Именно SELECT.

Всё, что нашёл по этому поводу - включить запись всех команд в сислог.
Но у сислога есть одна особенность - он может выкинуть лишнее при слишком высокой нагрузке. А по полученному ТЗ - "пусть мир подождёт".

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

Первый эксперимент не удался. Не пришло ничего вообще.
Если меняю log_destination = 'syslog' то все команды логируются.

сен 01 10:51:51 sandbox postgres[10271]: [4-1] СООБЩЕНИЕ:  оператор: select manana from kukara4a;
сен 01 10:51:51 sandbox postgres[10271]: [5-1] СООБЩЕНИЕ: продолжительность: 1.051 мс

Поэтому прошу помощи и совета - или я желаю странного, или оно как-то по хитрому может быть включено?

//Дмитрий

Настройки:

        log_destination = 'csvlog'
        log_filename = '/tmp/access.pglog.sock'
        logging_collector = on
        log_statement = 'all'
        log_min_error_statement = 'info'
        log_min_duration_statement = 0
        log_lock_waits = on
        log_rotation_size = 0
        logging_collector = on

Скриптик:

#!/usr/bin/env ruby
# encoding: UTF-8
socket_name = ARGV[0] || '/tmp/access.pglog.sock'
begin
  File.unlink socket_name
rescue
end

require 'socket'
require 'syslog/logger'
log ||= Syslog::Logger.new 'access.pglog'

server = UNIXServer.new socket_name
File.chmod 0777, socket_name
loop do
  socket = server.accept
  while line = socket.readline
    log.info line # дада, пишем в сислог.
                  # тут на самом деле несколько регулярок
  end
end
socket.close


--
Sent via pgsql-ru-general mailing list (pgsql-ru-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-ru-general


Re: [pgsql-ru-general] Запись логов в сокет вместо файла?

From
"Dmitry E. Oboukhov"
Date:
кстати по поводу логов: можно ли slow log настроить в отдельный лог
(не в общий postgresql.log, а в отдельный файл)?
--

. ''`.            Dmitry E. Oboukhov <unera@debian.org>
: :’  :
`. `~’               GPG key: 4096R/08EEA756 2014-08-30
  `- 71ED ACFC 6801 0DD9 1AD1  9B86 8D1F 969A 08EE A756

Attachment
2017-09-03 11:53 GMT+02:00 Dmitry E. Oboukhov <unera@debian.org>:
кстати по поводу логов: можно ли slow log настроить в отдельный лог
(не в общий postgresql.log, а в отдельный файл)?

А что такое "slow log"?  То, что пишется в лог при превышении log_min_duration_statement?  Была бы интересная возможность, но, насколько я знаю, на данный момент -- нет.

-- 
Oleksandr "Alex" Shulgin | Database Engineer | Zalando SE | Tel: +49 176 127-59-707

> кстати по поводу логов: можно ли slow log настроить в отдельный лог
> (не в общий postgresql.log, а в отдельный файл)?

> А что такое "slow log"? То, что пишется в лог при превышении
> log_min_duration_statement?

ага

>  Была бы интересная возможность, но, насколько я
> знаю, на данный момент -- нет.

просто получается если включить slow log то даже один запрос туда
попадающий занимает дофига места в логе. А если туда идет
какой-никакой поток запросов, то и вовсе в логе уже собственно
диагностической инфы практически нет.

и вот хотелось бы их эти логи разделить.

--

. ''`.            Dmitry E. Oboukhov <unera@debian.org>
: :’  :
`. `~’               GPG key: 4096R/08EEA756 2014-08-30
  `- 71ED ACFC 6801 0DD9 1AD1  9B86 8D1F 969A 08EE A756

Attachment