My PostgreSQL 11.6在基于现有映像的Docker容器中运行。运行docker logs my-postgres
显示了由dockerized PostgreSQL实例生成的日志消息。
问题:我正在尝试设置系统,以便PostgreSQL将消息记录到/var/lib/postgresql/data/log
中的日志文件中,并且在运行docker logs my-postgres
时仍然能够显示日志消息。
当/var/lib/postgresql/data/postgresql.conf
被修改为具有以下内容时,可以登录到文件:
log_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_rotation_age = 1d
log_rotation_size = 100MB
然而,运行docker logs my-postgres
现在显示
2020-02-23 18:01:49.388 UTC [1] LOG: redirecting log output to logging collector process
2020-02-23 18:01:49.388 UTC [1] HINT: Future log output will appear in directory "log".
并且新的日志消息不再显示在此处。
是否可以登录到日志文件并在docker logs my-postgres
中显示相同的日志消息?
docker compose.yml
version: '3.3'
services:
my-postgres:
container_name: my-postgres
image: timescale/timescaledb:latest-pg11
ports:
- 5432:5432
json-file
日志驱动程序。该驱动程序将容器的stdout
和stderr
中的所有内容保存到docker主机上的/var/lib/docker/containers/<container-id>/<container-id>-json.log
中。docker logs
命令只是从该文件中读取。默认情况下,postgresql会登录到stderr#log_destination = 'stderr'
您启用了日志收集器,它捕获发送到stderr的日志并将其保存到文件系统中。这就是为什么在docker logs
输出中看不到它们的原因。我在postgresql文档中看不到如何将日志同时发送到文件和stderr。不过我不是psql方面的专家。
https://www.postgresql.org/docs/9.5/runtime-config-logging.html
容器应该登录到stderr和stdout。将控制进程配置为登录到容器文件系统内的文件被认为是一种糟糕的做法。除非将文件夹附加为卷,否则当容器失效时,您将丢失文件系统。
如果您坚持您唯一的机会是将配置行log_filename
更改为类似postgresql.log
的静态内容,并创建指向stderrln -fs /dev/stderr /var/lib/postgresql/data/log/postgresql.log
的符号链接(并重写psql创建的postgresql.log
文件(。
我还没有测试这个解决方案,我对loggin收集器及其log_rotate功能有一些疑问。我不知道当日志文件被旋转时postgresql.log
会发生什么。也许它被postgres复制并删除/重新创建了原始文件,你会丢失你的链接。你可以尝试禁用log_truncate_on_rotation
布尔值来克服这个问题,但我不确定这是否有助于tbh。