Почему в “Docker logs” не попадают логи от Monolog?

111
09 апреля 2021, 11:50

Всем привет. Налаживаю работу с логами, я хочу зацепить некий агрегатор и собирать все логи им. В агрегатор попадают логи, которые видны в docker logs (тоесть из потоков stdout и stderr).

В моем приложении, я пытаюсь направить некую запись в stdout поток и увидеть ее с помощью команды docker logs:

$logger = new \Monolog\Logger('MyTestName');
$handler = new StreamHandler('php://stdout', Logger::DEBUG);
$logger->pushHandler($handler);
$logger->error('My test error message');

Однако в выхлопе docker logs светится только nginx, более никакие логи не попадают.

Подскажите, что я упустил?

Answer 1

Кратко:

У каждого приложения в Linux свой stdin, stdout и stderr, в логи докера попадает вывод самого Nginx, а не процесса, который он запускает (у него выводы свои).

Подробнее:

Вот так это работает: в докере работает Nginx, и именно его выводы stdin и stdout попадают в логи. Если взять образ официальный образ nginx, то там есть:

access_log  /var/log/nginx/access.log  main;

который указывает через симлинк на /dev/stdout:

ls -ld /var/log/nginx/access.log
# вывод:
... /var/log/nginx/access.log -> /dev/stdout

А докер цепляет этот /dev/stdout

PHP же выводит сообщения в stdout, который попадает на stdin веб-сервера Nginx, и он с ним ничего не делает (тут смотря какой SAPI, на fpm-fcgi и cgi-fcgi именно так, а на fcgiwrap вывод все же попадет).

Решения (подходят только если PHP и Nginx в одном контейнере):

  • писать напрямую в /dev/stdout
  • настроить Nginx, чтобы он "транслировал", я кажется видел какую-то такую настройку, но не уверен

В каком-то образе видел симлинк /var/log/syslog -> /dev/stdout, поэтому, еще один вариант:

  • писать в сислог
  • сделать симлинк сислога на /dev/stdout

И еще один вариант - сделать симлинк из своего скрипта перед new StreamHandler:

# это код на PHP
`ln -sf /proc/self/fd /dev/`

Буду рад, если вы проверите все варианты.

READ ALSO
Как в Phpstorm подсвечивать синтаксис в блоке?

Как в Phpstorm подсвечивать синтаксис в блоке?

Есть проект, в котором много файлов с расширениемfrm (роли, по сути, не играет)

86
Как принять POST json запрос на php?

Как принять POST json запрос на php?

Всем привет! Возник вопрос, с которым мучаюсь уже несколько дней

95
Проверить, является ли файл jpeg картинкой

Проверить, является ли файл jpeg картинкой

Как проверить на PHP, является ли изменяемый файл jpeg картинкой? Иногда файл имеет расширение jpeg, при изменении размера выдается ошибка:

96