Dockerized PostgreSQL войти в оба / log & `docker logs`? - PullRequest
0 голосов
/ 23 февраля 2020

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

1 Ответ

1 голос
/ 24 февраля 2020

По умолчанию docker использует json-file драйвер ведения журнала. Этот драйвер сохраняет все от контейнеров stdout и stderr в /var/lib/docker/containers/<container-id>/<container-id>-json.log на вашем docker хосте. Команда 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 на что-то stati c, как postgresql.log, и создать символ * Ссылка 1034 * (и переписать файл postgresql.log, созданный psql), указывающий на него как stderr ln -fs /dev/stderr /var/lib/postgresql/data/log/postgresql.log.

Я не тестировал решение, и у меня есть определенные сомнения относительно сборщика журналов и его Возможности log_rotate. Я понятия не имею, что происходит с postgresql.log, когда файл журнала вращается. Возможно, он скопирован и исходный файл удален / воссоздан postgres, и вы потеряете свою ссылку. Вы можете попробовать отключить log_truncate_on_rotation boolean, чтобы преодолеть это, но я не уверен, поможет ли это tbh.

...