У меня есть приложение 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 (или любой другой рабочий процесс)?




войти в файл /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