将所有查询记录在正式的Postgres泊坞窗映像中

sva*_*ili 5 postgresql docker

我有一个基于Postgres官方docker镜像的docker容器。当我使用查看Docker容器的日志时,我想查看传入的查询docker logs -f。这是我的Dockerfile:

FROM postgres:11.1-alpine

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

ENV PGDATA=/data
Run Code Online (Sandbox Code Playgroud)

这是我的docker-compose.yml文件与此服务相关的部分:

version: '3'
services:
  mock_data:
    image: mock_data
    container_name: mock_data
    ports:
         - 5434:5432/tcp
Run Code Online (Sandbox Code Playgroud)

在Docker日志中包括传入查询的最简单方法是什么?

小智 81

如果使用 Docker Compose,您可以将此行添加到您的 docker-compose.yaml文件中:

command: ["postgres", "-c", "log_statement=all"]
Run Code Online (Sandbox Code Playgroud)

并且您的所有查询都将写入容器日志文件。


Flo*_*ida 28

设置log_destinationstderr在不创建新图像的情况下为我解决问题:

version: "2.2"
services:
  db:
    image: postgres:12-alpine
    command: ["postgres", "-c", "log_statement=all", "-c", "log_destination=stderr"]
Run Code Online (Sandbox Code Playgroud)

然后我能够使用docker-compose logs -f db.
也应该适用于其他版本,但我只用postgres:12-alpine.

  • 不需要 `log_destination=stderr`,因为默认目标是 `stderr`。请参阅 - https://www.postgresql.org/docs/current/runtime-config-logging.html (3认同)

lon*_*kit 16

如果直接从 docker 命令运行 docker run,请尝试执行以下命令:

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
Run Code Online (Sandbox Code Playgroud)

尾随部分是覆盖命令,如此处所述覆盖 docker 文件

祝你好运!


dam*_*amb 11

根据官方 Postgres 映像的文档(数据库配置部分),您可以

  • 注入自定义配置文件(例如通过调整默认配置文件)或
  • 启动容器设置所需的配置参数。

在后一种情况下,只需启动容器即可

$ docker run -d --name some-postgres postgres -c log_statement=all
Run Code Online (Sandbox Code Playgroud)

它利用覆盖 Dockerfile 图像默认值

如果您想启用其他日志记录选项,请查看PostgreSQL 文档的错误报告和日志记录部分。


atl*_*ine 10

请参阅,您应该启用logging_collector,那么你就可以看到来电查询log_directorylog_filename

并且要在 中启用它docker logs,您必须使用一些技巧来实现它,一种解决方案如下:

包装器.sh:

#!/usr/bin/env bash
mkdir /logs
touch /logs/postgresql.log
chmod -R 777 /logs
tail -f /logs/* &
/docker-entrypoint.sh "$@"
Run Code Online (Sandbox Code Playgroud)

以上将用于tail监视/logs/postgresql.log稍后将被使用postgresqllogging_collector,并显示它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"]
Run Code Online (Sandbox Code Playgroud)

上面会用到customize wrapper.sh,它会先监听postgre日志,打印出来,然后contiune执行默认docker-entrypoint.sh启动postgresql server。

容器启动后,在传入查询之前显示日志:

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
Run Code Online (Sandbox Code Playgroud)

模拟一些传入的查询,并再次查看日志:

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;
Run Code Online (Sandbox Code Playgroud)

你可以在上面看到我们模拟了一个 sql execute SELECT datname FROM pg_database;docker logs我们已经可以看到这个 sql。