在正式的 Postgres 码头映像中记录所有查询

我有一个码头集装箱,基于 Postgres 的官方码头形象。当我使用 docker logs -f查看 docker 容器的日志时,我希望看到传入的查询。这是我的文件:

FROM postgres:11.1-alpine


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


ENV PGDATA=/data

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

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

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

52515 次浏览

参考 这个,您应该启用 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 "$@"

以上将使用 tail监测 /logs/postgresql.log,这将在以后由 postgresqllogging_collector使用,并显示它的 docker logs

文件夹:

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"]

上面将使用自定义 wrapper.sh,它将首先监视 postgre 日志,打印它,然后继续执行默认的 docker-entrypoint.sh以启动 postgreql 服务器。

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

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

模拟一些传入查询,然后再次查看日志:

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;

您可以看到上面我们模拟了一个 sql 执行 SELECT datname FROM pg_database;,在 docker logs中我们已经看到了这个 sql。

如果使用 Docker Compose,您可以将这一行添加到 码头作曲文件:

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

所有查询都将写入容器日志文件。

如果运行 docker 命令直接从 docker 命令运行,请尝试 follow 命令:

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

跟踪部分是重写命令,如 重写码头文件所述

祝你好运!

根据 官方的 Postgres 图片的文档(数据库配置节) ,您可以

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

在后一种情况下,只需用

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

它利用 重写 Dockerfile 映像默认值

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

log_destination设置为 stderr对我来说非常有效,没有创建一个新的图像:

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

然后我用 docker-compose logs -f db跟踪了这些语句。
应该与其他版本太,但我只测试了它与 postgres:12-alpine