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

时间:2019-07-12 23:26:58

标签: postgresql docker

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

FROM postgres:11.1-alpine

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

ENV PGDATA=/data

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

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

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

5 个答案:

答案 0 :(得分:8)

我不知道这对其他人是否有用,但是...您可以将此行添加到您的 docker-compose.yaml 文件中:

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

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

答案 1 :(得分:1)

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来跟踪语句。
应该也可以使用旧版本,但是我只在12上进行了测试。

答案 2 :(得分:0)

请参阅this,应启用logging_collector,然后您才能在log_directory的{​​{1}}中看到传入的查询。

要在log_filename中启用它,您必须制作一些技巧,一种解决方案如下:

wrapper.sh:

docker logs

以上将使用#!/usr/bin/env bash mkdir /logs touch /logs/postgresql.log chmod -R 777 /logs tail -f /logs/* & /docker-entrypoint.sh "$@" 来监视tail,稍后将由/logs/postgresql.log的{​​{1}}使用并显示postgresql

Dockerfile:

logging_collector

以上将使用自定义docker logs,它将首先监视postgre日志,打印它,然后继续执行默认的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"] 以启动postgresql服务器。

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

wrapper.sh

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

docker-entrypoint.sh

您可以在上方看到我们模拟一个sql执行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。

答案 3 :(得分:0)

如果要直接从docker命令运行docker,请尝试遵循以下命令:

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

尾部是此处overriding docker file

中所述的重载命令

祝你好运!

答案 4 :(得分:0)

根据official Postgres image的文档(数据库配置部分),您可以

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

在后一种情况下,只需使用以下命令启动容器

@commands.command()
async def getbio(self, ctx, user: discord.Member=None):
     if user is None:
        user = ctx.author
        db = sqlite3.connect('profiles.sqlite')
        cursor = db.cursor()
        cursor.execute(f"SELECT profile FROM profile WHERE username={user.id}")
        result = cursor.fetchone()
        if result is None:
            await ctx.send ("Bio not set")
        else:
            cursor.execute(f"SELECT profile FROM profile WHERE username={user.id}")
            result = cursor.fetchone()
            await ctx.send (str(result[0]))

它使用Overriding Dockerfile image defaults

如果您想启用其他日志记录选项,请查看PostgreSQL文档的Error reporting and Logging section