¿Cómo registrar consultas PostgreSQL?

373

¿Cómo habilitar el registro de todos los SQL ejecutados por PostgreSQL 8.3?

Editado (más información) Cambié estas líneas:

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

Y reinicie el servicio PostgreSQL ... pero no se creó ningún registro ... Estoy usando Windows Server 2003.

¿Algunas ideas?

Pablo
fuente
15
Esto es importante:logging_collector = on
bonyiii
Además, tenga en cuenta que en algunas distribuciones de GNU / Linux (por ejemplo, Debian Jessie) systemctl restart postgresqlpuede que no se reinicie el servicio PostgreSQL que ha configurado (no entiendo por qué todavía), por lo que no se aplicarán los cambios en el archivo de configuración. Es más seguro de usar pg_ctl(o pg_ctlclusteren Debian).
Skippy le Grand Gourou
44
Acabo probado esto en Ubuntu 16.04 LTS, con PostgreSQL 9.5, y systemctl reload postgresql, systemctl restart postgresql, service postgresql reloady service postgresql restarttodos los cambios de configuración renderiza eficaz.
Ben Johnson

Respuestas:

466

En su data/postgresql.confarchivo, cambie la log_statementconfiguración a 'all'.


Editar

Mirando su nueva información, diría que puede haber algunas otras configuraciones para verificar:

  • asegúrese de haber activado la log_destinationvariable
  • asegúrese de encender el logging_collector
  • también asegúrese de que el log_directorydirectorio ya exista dentro del datadirectorio y que el usuario de postgres pueda escribir en él.
Jarret Hardie
fuente
3
Entonces, por curiosidad, ¿eso significa que PostgreSQL no puede habilitar el registro a menos que reinicie el servidor? En MySQL, es tan simple como "SET GLOBAL general_log = 'ON';"
Antony
77
Yo mismo no sé si hay una manera de hacerlo usando una instrucción SQL como MySQL, pero puede enviar un comando en ejecución a un servidor en ejecución para recargar la configuraciónpg_ctl reload
Jarret Hardie
99
PostgreSQL todavía no tiene una forma de cambiar sus parámetros a través de sentencias SQL (a partir de 9.2). La mayoría de los parámetros de registro se pueden cambiar sin un reinicio completo del servidor, simplemente haciendo pg_ctl reload en su lugar. Sin embargo, se requiere un reinicio para cambiar logging_collector.
Greg Smith
66
Con Postgres 9.4 y el nuevo ALTER SYSTEMcomando, un superusuario puede configurar los parámetros de GUC desde SQL.
Erwin Brandstetter
66
El datadirectorio citado en la respuesta no es su nombre literal; se refiere a la ruta asignada a la data_directoryvariable en el archivo de configuración de PostgreSQL. En Debian y Ubuntu GNU / Linux, este archivo generalmente reside en /etc/postgresql/$v/main/postgresql.confdónde $vestá la versión del servidor. Además, en los sistemas antes mencionados, cuándo log_destination = 'stderr'se escribe la salida /var/log/postgresql/postgresql-$v-main.log, dónde $vestá la versión del servidor (no en alguna ubicación dentro data_directory).
Ben Johnson
104

Edite su /etc/postgresql/9.3/main/postgresql.confy cambie las líneas de la siguiente manera.

Nota : Si no encontró el postgresql.confarchivo, simplemente escriba $locate postgresql.confun terminal

  1. #log_directory = 'pg_log' a log_directory = 'pg_log'

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

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

  4. #logging_collector = off a logging_collector = on

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

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

  7. Consulta de fuego en postgresql select 2+2

  8. Encuentra inicio de sesión actual /var/lib/pgsql/9.2/data/pg_log/

Los archivos de registro tienden a crecer mucho con el tiempo y pueden matar su máquina. Por su seguridad, escriba un script bash que borre los registros y reinicie el servidor postgresql.

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

vijay
fuente
2
En debian stretch, también tuve que descomentar # log_destination = 'stderr'el archivo de configuración antes de que esto funcionara.
phihag
He seguido tus pasos cuidadosamente y no funciona. ¿Necesita reiniciar?
Yohanes AI
2
si no desea escribir un script bash pero solo desea que los registros se sobrescriban mensualmente, haga esto: log_filename = 'postgresql-%d.log'y no, no se sobrescribirá después de cada reinicio, se agregará cada día y se sobrescribirá cada mes. Por supuesto, hay días diferentes según el mes 28,29,30,31, pero se entiende la idea.
sojim2
44
SELECT set_config('log_statement', 'all', true);

Con un derecho de usuario correspondiente, puede usar la consulta anterior después de conectarse. Esto afectará el registro hasta que finalice la sesión.

Rix Beck
fuente
77
Generalmente es más limpio de usar SET log_statement = 'all'o (para el nivel de transacción) SET LOCAL log_statement = 'all'. También puede estar interesado en la configuración client_min_messagesy log_min_messages.
Craig Ringer
1
Esto es genial, ya que quiero registrar solo los mensajes de mi conexión. Lamentablemente me sale: permission denied to set parameter "log_statement"ya que mi usuario no es superusuario.
guettli
3
Puede solicitar subvenciones al administrador de la base de datos para ejecutar la función. 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

También necesita agregar estas líneas en PostgreSQL y reiniciar el servidor:

log_directory = 'pg_log'                    
log_filename = 'postgresql-dateformat.log'
log_statement = 'all'
logging_collector = on
Latif Premani
fuente
2
logging_collector = on es necesario
wjin
Funciona de maravilla. Estaba confundido por el comentario en el archivo de configuración que decía Required to be on for csvlogs, pensando que esta opción era registrar el resultado de la consulta y no solo las declaraciones, pero no es el caso.
Jacopofar
En su archivo data / postgresql.conf, cambie la configuración log_statement a 'all'.
FlyingV
32

FYI: Las otras soluciones solo registrarán las declaraciones de la base de datos predeterminada, generalmente, postgrespara registrar otras; comience con su solución; entonces:

ALTER DATABASE your_database_name
SET log_statement = 'all';

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

A
fuente
20

+1 a las respuestas anteriores. Yo uso siguiente config

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

Solo para tener más detalles sobre CentOS 6.4 (Red Hat 4.4.7-3) que ejecuta PostgreSQL 9.2, según las instrucciones que se encuentran en esta página web :

  1. Establecer (descomentar) log_statement = 'all'y log_min_error_statement = erroren /var/lib/pgsql/9.2/data/postgresql.conf.
  2. Vuelva a cargar la configuración de PostgreSQL. Para mí, esto se hizo corriendo /usr/pgsql-9.2/bin/pg_ctl reload -D /var/lib/pgsql/9.2/data/.
  3. Encuentra el inicio de sesión de hoy /var/lib/pgsql/9.2/data/pg_log/
Zoltán
fuente
44
No necesita reiniciar : a pg_ctl reloades suficiente y no interrumpe las conexiones. No estoy convencido de que esta respuesta agregue algo a los que ya están aquí.
Craig Ringer
1
@ CraigRinger Gracias por el comentario, es un hecho bastante importante. Actualizaré la respuesta una vez que haya probado tu sugerencia. Escribí esta respuesta principalmente como referencia para mí, porque en ese momento tenía muy poca experiencia con UNIX y quería tener toda la información necesaria en un solo lugar (por ejemplo, las ubicaciones de postgresql.conf y los archivos de registro).
Zoltán
0

También debe establecer este parámetro para registrar cada declaración:

log_min_duration_statement = 0
H.Ç.T
fuente
0

Estaba tratando de configurar el log_statementarchivo de configuración de postgres, pero de hecho el archivo no fue leído por nuestros postgres.

Confirmé que usando la solicitud:

select *
from pg_settings

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

Yo uso de esta manera https://stackoverflow.com/a/41912295/2294168

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