Comment enregistrer les requêtes PostgreSQL?

373

Comment activer la journalisation de tout SQL exécuté par PostgreSQL 8.3?

Modifié (plus d'infos) j'ai changé ces lignes:

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

Et redémarrez le service PostgreSQL ... mais aucun journal n'a été créé ... J'utilise Windows Server 2003.

Des idées?

Paul
la source
15
C'est important:logging_collector = on
bonyiii
Sachez également que sur certaines distributions GNU / Linux (par exemple Debian Jessie), il se systemctl restart postgresqlpeut que le service PostgreSQL que vous avez configuré ne redémarre pas réellement (je ne comprends pas encore pourquoi), donc les changements dans le fichier de configuration ne seront pas appliqués. Il est plus sûr à utiliser pg_ctl(ou pg_ctlclustersur Debian).
Skippy le Grand Gourou
4
Je viens de tester cela dans Ubuntu 16.04 LTS, avec PostgreSQL 9.5, et systemctl reload postgresql, systemctl restart postgresql, service postgresql reloadet service postgresql restarttous les changements de configuration efficace rends.
Ben Johnson

Réponses:

466

Dans votre data/postgresql.conffichier, changez le log_statementparamètre en 'all'.


Éditer

En regardant vos nouvelles informations, je dirais qu'il peut y avoir quelques autres paramètres à vérifier:

  • assurez-vous d'avoir activé la log_destinationvariable
  • assurez-vous d'allumer le logging_collector
  • assurez-vous également que le log_directoryrépertoire existe déjà à l'intérieur du datarépertoire et que l'utilisateur postgres peut y écrire.
Jarret Hardie
la source
3
Donc, juste curieux, cela signifie-t-il que PostgreSQL ne peut pas activer la journalisation à moins que je ne redémarre le serveur? Dans MySQL, c'est aussi simple que "SET GLOBAL general_log = 'ON';"
Antony
7
Je ne sais pas moi-même s'il existe un moyen de le faire en utilisant une instruction SQL comme MySQL, mais vous pouvez envoyer à un serveur en cours d'exécution une commande pour recharger la configuration avecpg_ctl reload
Jarret Hardie
9
PostgreSQL n'a pas encore de moyen de modifier ses paramètres via des instructions SQL (à partir de 9.2). La plupart des paramètres de journalisation peuvent être modifiés sans redémarrage complet du serveur, en effectuant simplement le rechargement de pg_ctl à la place. Cependant, il faut un redémarrage pour modifier logging_collector.
Greg Smith
6
Avec Postgres 9.4 et la nouvelle ALTER SYSTEMcommande, un superutilisateur peut définir des paramètres GUC à partir de SQL.
Erwin Brandstetter
6
Le datarépertoire cité dans la réponse n'est pas son nom littéral; il fait référence au chemin assigné à la data_directoryvariable dans le fichier de configuration de PostgreSQL. Sur Debian et Ubuntu GNU / Linux, ce fichier réside généralement à /etc/postgresql/$v/main/postgresql.conf, où $vest la version du serveur. En outre, sur les systèmes susmentionnés, lorsque log_destination = 'stderr'la sortie est écrite /var/log/postgresql/postgresql-$v-main.log, où $vest la version du serveur (et non à un emplacement à l'intérieur data_directory).
Ben Johnson
104

Modifiez votre /etc/postgresql/9.3/main/postgresql.confet modifiez les lignes comme suit.

Remarque : Si vous n'avez pas trouvé le postgresql.conffichier, tapez simplement $locate postgresql.confun terminal

  1. #log_directory = 'pg_log' à log_directory = 'pg_log'

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

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

  4. #logging_collector = off à logging_collector = on

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

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

  7. Requête d'incendie dans PostgreSQL select 2+2

  8. Rechercher la connexion actuelle /var/lib/pgsql/9.2/data/pg_log/

Les fichiers journaux ont tendance à augmenter considérablement au fil du temps et peuvent tuer votre machine. Pour votre sécurité, écrivez un script bash qui supprimera les journaux et redémarrera le serveur postgresql.

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

vijay
la source
2
Sur Debian Stretch, j'ai également dû décommenter # log_destination = 'stderr'le fichier de configuration avant que cela ne fonctionne.
phihag
J'ai suivi attentivement votre étape et cela ne fonctionne pas. Faut-il redémarrer?
Yohanes AI
2
si vous ne voulez pas écrire un script bash, mais que les journaux soient écrasés mensuellement, procédez comme log_filename = 'postgresql-%d.log'suit : et non, il ne sera pas écrasé après chaque redémarrage, il s'ajoutera pour chaque jour et sera écrasé chaque mois. Bien sûr, il existe différents jours selon le mois 28,29,30,31 - mais vous avez l'idée.
sojim2
44
SELECT set_config('log_statement', 'all', true);

Avec un droit d'utilisateur correspondant, vous pouvez utiliser la requête ci-dessus après la connexion. Cela affectera la journalisation jusqu'à la fin de la session.

Rix Beck
la source
7
Il est généralement plus propre à utiliser SET log_statement = 'all'ou (pour le niveau de transaction) SET LOCAL log_statement = 'all'. Vous pourriez également être intéressé par les paramètres client_min_messageset log_min_messages.
Craig Ringer
1
C'est génial, car je veux enregistrer uniquement les messages de ma connexion. Malheureusement j'obtiens: permission denied to set parameter "log_statement"puisque mon utilisateur n'est pas superutilisateur.
guettli
3
Vous pouvez demander à l'administrateur de la base de données des autorisations pour exécuter la fonction. 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

Vous devez également ajouter ces lignes dans PostgreSQL et redémarrer le serveur:

log_directory = 'pg_log'                    
log_filename = 'postgresql-dateformat.log'
log_statement = 'all'
logging_collector = on
Latif Premani
la source
2
logging_collector = on est nécessaire
wjin
Fonctionne comme un charme. J'ai été confus par le commentaire sur le fichier de configuration disant Required to be on for csvlogs, pensant que cette option était de consigner la sortie de la requête et pas seulement les instructions, mais ce n'est pas le cas.
Jacopofar
Dans votre fichier data / postgresql.conf, remplacez le paramètre log_statement par «all».
FlyingV
32

Pour info: les autres solutions n'enregistrent que les instructions de la base de données par défaut - généralement postgres- pour en enregistrer d'autres; commencer par leur solution; puis:

ALTER DATABASE your_database_name
SET log_statement = 'all';

Réf: https://serverfault.com/a/376888 /log_statement

À
la source
20

+1 aux réponses ci-dessus. J'utilise la configuration suivante

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

Juste pour avoir plus de détails sur CentOS 6.4 (Red Hat 4.4.7-3) exécutant PostgreSQL 9.2, basé sur les instructions trouvées sur cette page Web :

  1. Set (uncomment) log_statement = 'all'et log_min_error_statement = errordans /var/lib/pgsql/9.2/data/postgresql.conf.
  2. Rechargez la configuration PostgreSQL. Pour moi, cela a été fait en courant /usr/pgsql-9.2/bin/pg_ctl reload -D /var/lib/pgsql/9.2/data/.
  3. Trouver la connexion d'aujourd'hui /var/lib/pgsql/9.2/data/pg_log/
Zoltán
la source
4
Vous n'avez pas besoin de redémarrer - un pg_ctl reloadest suffisant et n'interrompt pas les connexions. Pas convaincu que cette réponse ajoute quoi que ce soit à ceux déjà là.
Craig Ringer
1
@CraigRinger Merci pour le commentaire, c'est un fait assez important. Je mettrai à jour la réponse une fois que j'aurai essayé votre suggestion. J'ai écrit cette réponse principalement pour référence pour moi-même, car à l'époque j'avais très peu d'expérience avec UNIX, et je voulais avoir toutes les informations nécessaires en un seul endroit (par exemple les emplacements de postgresql.conf et les fichiers journaux).
Zoltán
0

Vous devez également définir ce paramètre pour consigner chaque instruction:

log_min_duration_statement = 0
H.Ç.T
la source
0

J'essayais de définir le log_statementfichier de configuration dans certains postgres mais en fait le fichier n'a pas été lu par nos postgres.

J'ai confirmé qu'en utilisant la demande:

select *
from pg_settings

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

J'utilise de cette façon https://stackoverflow.com/a/41912295/2294168

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