Всем привет. Налаживаю работу с логами, я хочу зацепить некий агрегатор и собирать все логи им. В агрегатор попадают логи, которые видны в 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, более никакие логи не попадают.
Подскажите, что я упустил?
Кратко:
У каждого приложения в 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
В каком-то образе видел симлинк /var/log/syslog
-> /dev/stdout
, поэтому, еще один вариант:
/dev/stdout
И еще один вариант - сделать симлинк из своего скрипта перед new StreamHandler
:
# это код на PHP
`ln -sf /proc/self/fd /dev/`
Буду рад, если вы проверите все варианты.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Есть проект, в котором много файлов с расширениемfrm (роли, по сути, не играет)
Всем привет! Возник вопрос, с которым мучаюсь уже несколько дней
Как проверить на PHP, является ли изменяемый файл jpeg картинкой? Иногда файл имеет расширение jpeg, при изменении размера выдается ошибка: