我有一个基于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日志中包括传入查询的最简单方法是什么?
答案 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
中所述的重载命令
祝你好运!
答案 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。