Dockerized PostgreSQL log to /log 和 'docker logs'?



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
默认情况下,docker使用json-file日志驱动程序。该驱动程序将容器的stdoutstderr中的所有内容保存到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。

相关内容

  • 没有找到相关文章

最新更新