Comment enregistrer les requêtes PostgreSQL?


281

Comment activer la journalisation de toutes les instructions SQL exécutées par PostgreSQL 8.3?

Modifié (plus d'info) 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 a été créé ... J'utilise Windows Server 2003.

Des idées?

+8

Ceci est important: '' 'logging_collector = on''' 08 janv.. 152015-01-08 13:15:29

  0

Aussi, méfiez-vous que sur certaines distributions GNU/Linux (Debian par exemple Jessie)' systemctl restart postgresql 'peut ne pas redémarrer le service PostgreSQL que vous avez configuré (je ne comprends pas encore pourquoi), donc les changements dans le fichier de configuration ne seront pas appliqués. Il est plus sûr d'utiliser 'pg_ctl' (ou' pg_ctlcluster' sur Debian). 07 avril. 162016-04-07 19:24:39

+3

Je viens de tester ceci dans Ubuntu 16.04 LTS, avec PostgreSQL 9.5, et 'systemctl reload postgresql',' systemctl restart postgresql', 'service postgresql reload' et' service postgresql restart' rendent toutes les modifications de configuration efficaces. 08 août. 162016-08-08 18:48:22

368

Dans votre fichier data/postgresql.conf, modifiez le paramètre log_statement-'all'.


Modifier

En regardant votre nouvelle information, je dirais qu'il ya peut-être quelques autres paramètres pour vérifier:

  • assurez-vous que vous avez activé la log_destination variables
  • assurez-vous d'allumer le logging_collector
  • également s'assurer que leLe répertoireexiste déjà dans le répertoire data et l'utilisateur postgres peut y écrire.
+3

Donc juste curieux, cela signifie-t-il que PostgreSQL ne peut pas activer la journalisation à moins que je ne redémarre le serveur? En MySQL, c'est aussi simple que "SET GLOBAL general_log = 'ON';" 07 déc.. 112011-12-07 22:41:00

+7

Je ne sais pas s'il existe un moyen de le faire en utilisant une instruction SQL comme MySQL, mais vous pouvez envoyer une commande au serveur en cours pour recharger la config avec 'pg_ctl reload' 08 déc.. 112011-12-08 08:14:46

+7

PostgreSQL n'a pas le moyen de changer paramètres via les instructions SQL encore (à partir de 9.2). La plupart des paramètres de journalisation peuvent être modifiés sans redémarrage complet du serveur, en utilisant simplement pg_ctl reload à la place. Cependant, il faut redémarrer pour modifier logging_collector. 23 juil.. 122012-07-23 19:11:12

+5

Avec Postgres 9.4 et le nouveau ['ALTER SYSTEM'] (http://www.postgresql.org/docs/current/interactive/sql-altersystem).commande html) un super-utilisateur peut définir des paramètres GUC à partir de SQL. 25 mai. 152015-05-25 23:55:40

  0

FWIW - Si vous faites les 3 choses ci-dessus, cela fonctionne. C'est-à-dire: 'logging_collector = on',' log_destination = 'stderr'', 'log_statement =' all'' Il manquait' log_destination', et cela ne fonctionnait pas. 03 févr.. 162016-02-03 13:59:33

  0

Qu'en est-il des fonctions de déclenchement? Peuvent-ils être connectés? 16 mars. 162016-03-16 02:57:59

+3

Le répertoire 'data' cité dans la réponse n'est pas son nom littéral; il fait référence au chemin affecté à la variable 'data_directory' dans le fichier de configuration de PostgreSQL. Sur Debian et Ubuntu GNU/Linux, ce fichier se trouve habituellement dans/etc/postgresql/$ v/main/postgresql.conf', où '$ v' est la version du serveur. En outre, sur les systèmes mentionnés ci-dessus, lorsque 'log_destination = 'stderr'', la sortie est écrite dans'/var/log/postgresql/postgresql- $ v-main.log', où '$ v' est la version du serveur (pas à un emplacement dans 'data_directory'). 08 août. 162016-08-08 18:40:24


23

Set log_statement-all:

Error Reporting and Logging - log_statement


18

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

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

31
SELECT set_config('log_statement', 'all', true); 

Avec un utilisateur correspondant peut utiliser la requête droite ci-dessus après la connexion. Cela affectera la journalisation jusqu'à la fin de la session.

+5

Il est généralement plus propre d'utiliser 'SET log_statement = 'all'' ou (pour le niveau de transaction)' SET LOCAL log_statement =' all''. Les paramètres 'client_min_messages' et' log_min_messages' pourraient également vous intéresser. 11 nov.. 132013-11-11 02:31:12

+1

C'est génial, puisque je veux seulement enregistrer les messages de ma connexion. Malheureusement, j'obtiens: 'permission refusée pour définir le paramètre" log_statement "' car mon utilisateur n'est pas un super-utilisateur. 10 juin. 142014-06-10 12:20:18

+3

Vous pouvez demander à l'administrateur de la base de données les autorisations d'exécution de la fonction. 'GRANT {EXÉCUTER | ALL [PRIVILEGES]} ON {FUNCTION nom_fonction ([[argmode] [arg_name] arg_type [, ...]]) [, ...] | ALL FUNCTIONS IN SCHEMA nom_schéma [, ...]} TO {[GROUP] nom_rôle | PUBLIC} [, ...] [AVEC OPTION DE SUBVENTION] ' 31 août. 142014-08-31 20:03:23


8

Juste pour avoir plus de détails pour CentOS 6.4 (Red Hat 4.4.7-3) en cours d'exécution PostgreSQL 9.2, sur la base des instructions données on this web page:

  1. Set (uncomment) log_statement = 'all' et log_min_error_statement = error dans /var/lib/pgsql/9.2/data/postgresql.conf.
  2. Recharger la configuration de PostgreSQL. Pour moi, cela a été fait en exécutant /usr/pgsql-9.2/bin/pg_ctl reload -D /var/lib/pgsql/9.2/data/.
  3. Trouver le journal d'aujourd'hui dans /var/lib/pgsql/9.2/data/pg_log/
+4

Vous n'avez pas besoin de * redémarrer * - un' reload pg_ctl' est suffisant, et n'interrompt pas les connexions. Pas convaincu que cette réponse ajoute quelque chose à ceux déjà là. 11 nov.. 132013-11-11 02:29:13

+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, car à l'époque j'avais très peu d'expérience avec UNIX, et je voulais avoir toutes les informations nécessaires à un endroit (par exemple les emplacements de postgresql.conf et les fichiers journaux). 11 nov.. 132013-11-11 08:59:01

+1

@CraigRinger testé et mis à jour dans la réponse. Merci! 09 déc.. 132013-12-09 09:33:53


22

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

log_directory = 'pg_log'      
log_filename = 'postgresql-dateformat.log' 
log_statement = 'all' 
logging_collector = on 
+2

logging_collector = on est nécessaire 06 déc.. 142014-12-06 00:21:31

  0

C'est la réponse la plus complète et la plus directe. 21 déc.. 172017-12-21 19:10:35

  0

Fonctionne comme un charme. J'ai été troublé par le commentaire sur le fichier de configuration disant "Obligatoire d'être sur csvlogs", pensant que cette option était d'enregistrer les résultats de la requête et pas seulement les instructions, mais ce n'est pas le cas. 17 janv.. 182018-01-17 10:23:30


44

Modifier votre /etc/postgresql/9.3/main/postgresql.conf et modifier les lignes comme suit.

Remarque: Si vous ne trouvez pas le fichier postgresql.conf, puis tapez simplement $locate postgresql.conf dans un 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. En option: SELECT set_config('log_statement', 'all', true);

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

  7. requête d'incendie dans postgresql select 2+2

  8. Trouver journal en cours dans /var/lib/pgsql/9.2/data/pg_log/

Les fichiers journaux ont tendance à croître beaucoup plus de temps, et peut tuer votre machine. Pour votre sécurité, écrivez un script bash qui va supprimer les journaux et redémarrer le serveur postgresql.

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


7

Pour votre information: Les autres solutions ne consigner les instructions de la base de données habituellement défaut postgres -pour connecter d'autres; commencer avec leur solution; puis:

ALTER DATABASE your_database_name 
SET log_statement = 'all'; 

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