Como registrar consultas no PostgreSQL?

373

Como habilitar o log de todos os SQL executados pelo PostgreSQL 8.3?

Editado (mais informações) eu mudei estas linhas:

log_directory = 'pg_log'                    
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_statement = 'all'

E reinicie o serviço PostgreSQL ... mas nenhum log foi criado ... Estou usando o Windows Server 2003.

Alguma ideia?

Paulo
fonte
15
Isso é importante:logging_collector = on
bonyiii
Além disso, lembre-se de que em algumas distribuições GNU / Linux (por exemplo, Debian Jessie), systemctl restart postgresqlna verdade, não é possível reiniciar o serviço PostgreSQL que você configurou (ainda não entendo o porquê), portanto, as alterações no arquivo de configuração não serão aplicadas. É mais seguro de usar pg_ctl(ou pg_ctlclusterno Debian).
Skippy le Grand Gourou
4
Eu só testei isso no Ubuntu 16.04 LTS, com PostgreSQL 9.5, e systemctl reload postgresql, systemctl restart postgresql, service postgresql reloade service postgresql restarttodos tornam alterações de configuração eficaz.
Ben Johnson

Respostas:

466

No seu data/postgresql.confarquivo, altere a log_statementconfiguração para 'all'.


Editar

Observando suas novas informações, eu diria que pode haver algumas outras configurações para verificar:

  • verifique se você ativou a log_destinationvariável
  • certifique-se de ligar o logging_collector
  • também verifique se o log_directorydiretório já existe dentro do datadiretório e se o usuário do postgres pode gravá-lo.
Jarret Hardie
fonte
3
Tão curioso, isso significa que o PostgreSQL não pode ativar o log, a menos que eu reinicie o servidor? No MySQL, é tão simples quanto "SET GLOBAL general_log = 'ON';"
Antony
7
Eu mesmo não sei se há uma maneira de fazê-lo usando uma instrução SQL como MySQL, mas você pode enviar um servidor executando um comando para recarregar a configuração compg_ctl reload
Jarret Hardie
9
O PostgreSQL ainda não tem como alterar seus parâmetros através de instruções SQL (a partir da 9.2). A maioria dos parâmetros de log pode ser alterada sem a reinicialização completa do servidor, basta recarregar o pg_ctl. No entanto, é preciso reiniciar para alterar o logging_collector.
Greg Smith
6
Com o Postgres 9.4 e o novo ALTER SYSTEMcomando, um superusuário pode definir parâmetros GUC a partir do SQL.
Erwin Brandstetter
6
O datadiretório citado na resposta não é seu nome literal; refere-se ao caminho atribuído à data_directoryvariável no arquivo de configuração do PostgreSQL. No Debian e no Ubuntu GNU / Linux, esse arquivo geralmente reside em /etc/postgresql/$v/main/postgresql.conf, onde $vestá a versão do servidor. Além disso, nos sistemas mencionados acima, quando log_destination = 'stderr'a saída é gravada em /var/log/postgresql/postgresql-$v-main.log, onde $vestá a versão do servidor (não em algum local interno data_directory).
Ben Johnson
104

Edite seu /etc/postgresql/9.3/main/postgresql.confe altere as linhas da seguinte maneira.

Nota : Se você não encontrou o postgresql.confarquivo, basta digitar $locate postgresql.confum terminal

  1. #log_directory = 'pg_log' para log_directory = 'pg_log'

  2. #log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' para log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'

  3. #log_statement = 'none' para log_statement = 'all'

  4. #logging_collector = off para logging_collector = on

  5. Opcional :SELECT set_config('log_statement', 'all', true);

  6. sudo /etc/init.d/postgresql restart ou sudo service postgresql restart

  7. Consulta de incêndio no postgresql select 2+2

  8. Encontre o login atual /var/lib/pgsql/9.2/data/pg_log/

Os arquivos de log tendem a crescer muito com o tempo e podem matar sua máquina. Para sua segurança, escreva um script bash que exclua os logs e reinicie o servidor postgresql.

Obrigado @paul, @Jarret Hardie, @ Zoltán, @Rix Beck e @Latif Premani

vijay
fonte
2
No debian stretch, eu também tive que descomentar # log_destination = 'stderr'o arquivo de configuração antes que isso funcionasse.
Phihag 4/07
Segui sua etapa com cuidado e ela não funciona. Precisa reiniciar?
Yohanes AI
2
se você não quiser escrever um script bash, mas apenas desejar que os logs sejam substituídos mensalmente, faça o seguinte: log_filename = 'postgresql-%d.log'e não, ele não será substituído após cada reinicialização, será anexado a cada dia e substituído a cada mês. É claro que existem dias diferentes, dependendo do mês 28,29,30,31 - mas você entendeu.
sojim2
44
SELECT set_config('log_statement', 'all', true);

Com um usuário correspondente, o direito pode usar a consulta acima após a conexão. Isso afetará o log até a sessão terminar.

Rix Beck
fonte
7
Geralmente é mais limpo de usar SET log_statement = 'all'ou (para o nível da transação)SET LOCAL log_statement = 'all' . Você também pode estar interessado nas configurações client_min_messagese log_min_messages.
Craig Ringer
11
Isso é ótimo, pois quero registrar apenas as mensagens da minha conexão. Infelizmente eu recebo:permission denied to set parameter "log_statement" já que meu usuário não é superusuário.
guettli
3
Você pode solicitar ao administrador do banco de dados subsídios para executar a função. GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON { FUNCTION function_name ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) [, ...] | ALL FUNCTIONS IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
Rix Beck
35

Você também precisa adicionar estas linhas no PostgreSQL e reiniciar o servidor:

log_directory = 'pg_log'                    
log_filename = 'postgresql-dateformat.log'
log_statement = 'all'
logging_collector = on
Latif Premani
fonte
2
logging_collector = on é necessário
wjin
Funciona como um encanto. Fiquei confuso com o comentário no arquivo de configuração dizendo Required to be on for csvlogs, pensando que essa opção era registrar a saída da consulta e não apenas as instruções, mas não é o caso.
Jacopofar 17/01/19
No seu arquivo data / postgresql.conf, altere a configuração log_statement para 'all'.
FlyingV 10/04/19
32

FYI: As outras soluções registrarão apenas declarações do banco de dados padrão - geralmente postgres- para registrar outras; comece com a solução; então:

ALTER DATABASE your_database_name
SET log_statement = 'all';

Ref: https://serverfault.com/a/376888 /log_statement

AT
fonte
20

+1 nas respostas acima. Eu uso a seguinte configuração

log_line_prefix = '%t %c %u ' # time sessionid user
log_statement = 'all'
Shekhar
fonte
10

Apenas para ter mais detalhes sobre o CentOS 6.4 (Red Hat 4.4.7-3) executando o PostgreSQL 9.2, com base nas instruções encontradas nesta página da web :

  1. Jogo (descomente) log_statement = 'all'e log_min_error_statement = errorem /var/lib/pgsql/9.2/data/postgresql.conf.
  2. Recarregue a configuração do PostgreSQL. Para mim, isso foi feito executando /usr/pgsql-9.2/bin/pg_ctl reload -D /var/lib/pgsql/9.2/data/.
  3. Encontre o login de hoje /var/lib/pgsql/9.2/data/pg_log/
Zoltán
fonte
4
Você não precisa reiniciar - a pg_ctl reloadé suficiente e não interrompe as conexões. Não convencido de que esta resposta acrescente algo aos que já estão aqui.
Craig Ringer
11
@ CraigRinger Obrigado pelo comentário, isso é um fato muito importante. Atualizarei a resposta assim que tentar sua sugestão. Eu escrevi esta resposta principalmente para referência, porque na época eu tinha muito pouca experiência com o UNIX e queria ter todas as informações necessárias em um único local (por exemplo, os locais do postgresql.conf e os arquivos de log).
Zoltán
0

Você também deve definir este parâmetro para registrar todas as instruções:

log_min_duration_statement = 0
H.Ç.T
fonte
0

Eu estava tentando definir o log_statement arquivo de configuração em alguns postgres, mas na verdade o arquivo não foi lido pelos nossos postgres.

Confirmei que usando a solicitação:

select *
from pg_settings

[...]
log_statement   none # That was not the value i was expected for !!!

Eu uso desta maneira https://stackoverflow.com/a/41912295/2294168

command: postgres -c config_file=/etc/postgresql.conf
Ser
fonte