Monolog stdout/stderr регистрирует текущий терминальный процесс в Docker

У меня есть приложение PHP/Symfony, работающее в Docker, которое использует Monolog для входа в stdout/stderr. Все это отлично работает, за исключением случаев запуска консольных команд Symfony внутри контейнера.

monolog:
    handlers:
        stdout:
            type: filter
            handler: stdout_unfiltered
            max_level: notice
            channels: ['!event']

        stdout_unfiltered:
            type: stream
            level: debug
            path: 'php://stdout'

        stderr:
            type: stream
            level: warning
            channels: ['!event']
            path: 'php://stderr'

        console:
            type: console
            channels: ['!console', '!doctrine', '!event']
            process_psr_3_messages: false

Проблема в том, что всякий раз, когда выполняется команда, обработчики «stdout», «stderr» и «console» регистрируются в текущем терминальном процессе. Это приводит к тому, что вывод консоли искажается и docker logs не содержит записей журнала: http://i.imgur.com/yB1IKrR.png.

Будет ли простой способ всегда отправлять вывод журнала в процесс php-fpm (или любой другой рабочий процесс)?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
7
0
2 831
1

Ответы 1

войти в файл /proc/1/fd/1 (или fd/2)

monolog:
    handlers:
        ...
        stdout_unfiltered:
            type: stream
            level: debug
            path: '/proc/1/fd/1'
        stderr:
            type: stream
            level: warning
            channels: ['!event']
            path: '/proc/1/fd/2'
        ...

Возможно, вы можете проверить, на что указывает эта точка, и перенаправить туда (docker exec aContainer ls -l /proc/1/fd/2), но это может измениться в зависимости от запуска контейнера.

Не уверен, что это идеально, но работает (когда у symfony есть разрешение на запись в /proc/1/fd/*).

Только что узнал, что я не первый с идеей перенаправления на /proc/1/fd/1: stackoverflow.com/a/46220104/4124767

simohe 13.07.2020 17:44

Другие вопросы по теме