81 votes

Enregistrer toutes les requêtes dans l'image docker Postgres officielle

J'ai un conteneur docker basé sur l'image docker officielle de Postgres. Je veux voir les requêtes entrantes lorsque je consulte les journaux du conteneur de docker en utilisant la fonction docker logs -f . Voici mon Dockerfile :

FROM postgres:11.1-alpine

COPY mock_data.sql /docker-entrypoint-initdb.d/mock_data.sql

ENV PGDATA=/data

et voici la partie de mon fichier docker-compose.yml relative à ce service :

version: '3'
services:
  mock_data:
    image: mock_data
    container_name: mock_data
    ports:
         - 5434:5432/tcp

Quel est le moyen le plus simple d'inclure les requêtes entrantes dans les journaux de docker ?

139voto

sprat Points 864

Si vous utilisez Docker Compose, vous pouvez ajouter cette ligne à votre fichier docker-compose.yaml fichier :

command: ["postgres", "-c", "log_statement=all"]

et toutes vos requêtes seront écrites dans le fichier journal du conteneur.

45voto

Florian Fida Points 402

Réglage de log_destination a stderr a fait l'affaire pour moi sans créer une nouvelle image :

version: "2.2"
services:
  db:
    image: postgres:12-alpine
    command: ["postgres", "-c", "log_statement=all", "-c", "log_destination=stderr"]

Et puis j'ai pu retracer les déclarations en utilisant docker-compose logs -f db .
Cela devrait aussi fonctionner avec d'autres versions, mais je l'ai seulement testé avec postgres:12-alpine .

28voto

longbkit Points 382

En cas d'exécution de docker run directement à partir de la commande docker, essayez la commande suivante :

docker run -d -e POSTGRES_USER=user -e POSTGRES_PASSWORD=pass -e POSTGRES_DB=postgres -p 5432:5432 --name db postgres:10 postgres -c log_statement=all

La partie terminale est une commande prioritaire comme décrit ici. Remplacer le fichier docker

Bonne chance !

12voto

lagom Points 3067

Se référer à este vous devez activer logging_collector alors vous pouvez voir les requêtes entrantes dans la rubrique log_directory 's log_filename .

Et pour l'activer dans docker logs vous avez dû trouver une astuce pour le faire, une solution est la suivante :

wrapper.sh :

#!/usr/bin/env bash
mkdir /logs
touch /logs/postgresql.log
chmod -R 777 /logs
tail -f /logs/* &
/docker-entrypoint.sh "$@"

Ci-dessus, nous utiliserons tail pour surveiller /logs/postgresql.log qui sera ensuite utilisé par postgresql 's logging_collector et le montrer docker logs .

Dockerfile :

FROM postgres:11.1-alpine
COPY wrapper.sh /
RUN chmod +x /wrapper.sh
ENTRYPOINT ["/wrapper.sh"]
CMD ["postgres", "-c", "logging_collector=on", "-c", "log_directory=/logs", "-c", "log_filename=postgresql.log", "-c", "log_statement=all"]

Ci-dessus, nous utiliserons personnaliser wrapper.sh il va d'abord surveiller le journal de postgre, l'imprimer, puis se connecter pour exécuter la commande par défaut docker-entrypoint.sh pour démarrer le serveur postgresql.

Après le démarrage du conteneur, afficher les journaux avant les requêtes entrantes :

orange@orange:~/abc$ docker build -t abc:1 .
orange@orange:~/abc$ docker run -idt abc:1
orange@orange:~/abc$ docker ps
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS               NAMES
c9112eb785e5        abc:1                  "/wrapper.sh postgre…"   2 seconds ago       Up 1 second         5432/tcp            loving_joliot
orange@orange:~/abc$ docker logs loving_joliot
The files belonging to this database system will be owned by user "postgres".
......
2019-07-13 03:38:14.030 UTC [46] LOG:  database system was shut down at 2019-07-13 03:38:13 UTC
2019-07-13 03:38:14.034 UTC [10] LOG:  database system is ready to accept connections

Simulez quelques requêtes entrantes, et revoyez les logs :

orange@orange:~/abc$ docker exec -it -u postgres loving_joliot psql -c "SELECT datname FROM pg_database;"
  datname
-----------
 postgres
 template1
 template0
(3 rows)
orange@orange:~/abc$ docker logs loving_joliot
The files belonging to this database system will be owned by user "postgres".
......
2019-07-13 03:38:14.030 UTC [46] LOG:  database system was shut down at 2019-07-13 03:38:13 UTC
2019-07-13 03:38:14.034 UTC [10] LOG:  database system is ready to accept connections
2019-07-13 03:41:22.859 UTC [62] LOG:  statement: SELECT datname FROM pg_database;

Vous pouvez voir ci-dessus que nous simulons l'exécution d'un sql. SELECT datname FROM pg_database; et dans docker logs nous pouvions déjà voir ce sql.

8voto

damb Points 71

Selon la documentation de l image officielle de Postgres (section Configuration de la base de données ), vous pouvez soit

  • injecter un fichier de configuration personnalisé (par exemple, en adaptant le fichier de configuration par défaut) ou
  • démarrer le conteneur en définissant les paramètres de configuration requis.

Dans ce dernier cas, il suffit de démarrer le conteneur avec

$ docker run -d --name some-postgres postgres -c log_statement=all

Il fait appel à Remplacer les valeurs par défaut des images Dockerfile .

Si vous souhaitez activer d'autres options de journalisation, consultez le site Web de la Commission européenne. Section sur les rapports d'erreurs et la journalisation de la documentation de PostgreSQL.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X