Symfony регистрируется на stdout внутри контейнера Docker

Я создаю образ докера для приложения Symfony. На этом изображении я хочу транслировать логи Symfony на стандартный вывод. Итак, подобно тому, как настраиваются логи nginx, я добавил эту строку в свой Dockerfile:

ln -sf /dev/stdout /var/www/project/app/logs/prod.log

Внутри контейнера я вижу это:

$ ls /var/www/project/app/logs/ -l
total 12
-rw-r--r-- 1 501 games 4473 Jul 21 08:36 dev.log
lrwxrwxrwx 1 501 games   11 Jul 21 08:35 prod.log -> /dev/stdout

Однако приложение выдает следующую ошибку:

Неустранимая ошибка PHP: необработанное исключение «UnexpectedValueException» с сообщением «Поток или файл« /var/www/project/app/logs/prod.log »не может быть открыт: не удалось открыть поток: такого файла или каталога нет в / вар / WWW / проект / приложение / кэш / прод / classes.php: 5808
Трассировки стека:
# 0 /var/www/project/app/cache/prod/classes.php(5746): Monolog \ Handler \ StreamHandler-> write (Array)
# 1 /var/www/project/app/cache/prod/classes.php(5917): Monolog \ Handler \ AbstractProcessingHandler-> handle (Array)
# 2 /var/www/project/app/cache/prod/classes.php(6207): Monolog \ Handler \ FingersCrossedHandler-> handle (Array)
# 3 /var/www/project/app/cache/prod/classes.php(6276): Monolog \ Logger-> addRecord (500, ‘Неустранимая ошибка: Un …’, массив)
# 4 /var/www/project/app/cache/prod/classes.php(1978): Monolog \ Logger-> log («критический», «фатальная ошибка: Un …», массив)
# 5 /var/www/project/app/cache/prod/classes.php(2034): Symfony \ Component \ Debug \ ErrorHandler-> handleException (Object (Symfony \ Component \ Debug \ Exception \ FatalErrorException), Array)
# 6 [внутренняя функция]: Symfony \ Component \ Debug \ E в /var/www/project/app/cache/prod/classes.php в строке 5808

Какие-либо предложения ?

12

Решение

С помощью Monolog очень легко войти в stdout / stderr. Мои примеры используют stderr, но я думаю, что то же самое с stdout.

Вместо определения файла журнала вы просто вводите соответствующий путь потока

path:  "php://stderr"

НО вы еще не закончили. Вы также должны настроить PHP соответственно. Рабочие должны поймать вывод своих процессов и снова записать этот вывод на свой stderr.

Конфигурация PHP

#/etc/php/7.0/fpm/php-fpm.conf
error_log = /proc/self/fd/2

#/etc/php/7.0/fpm/pool.d/www.conf
catch_workers_output = yes

Конфигурация Symfony

# app/config/config_prod.yml
monolog:
handlers:
main:
type:         fingers_crossed
action_level: error
handler:      nested
nested:
type:  stream
path:  "php://stderr"level: debug
console:
type:  console

Если вы используете какую-либо систему управления процессами в толстом контейнере Docker, вы должны быть уверены, что эта система также регистрирует в stdout.

Пример с супервизором:

[supervisord]
nodaemon=true
;@see http://blog.turret.io/basic-supervisor-logging-with-docker/
;we need the output from the controlled processes
;but this is only possible with lowered loglevel
loglevel=debug

В целом убедитесь, что:

  • приложение регистрирует в stdout / stderr
  • PHP ловит рабочий вывод и записывает в stderr
  • необязательно: любая система управления процессами должна перенаправлять вывод управляемых процессов на стандартный вывод
27

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector