Laravel x Docker: Как получить журнал STDOUT для заданий в очереди? - PullRequest
1 голос
/ 18 июня 2019

Я использую Laravel на php-fpm, в составе Docker с Nginx, MySQL.Я хочу, чтобы все журналы из задания Laravel были видны из команды docker-compose logs на хост-компьютере, однако остались безуспешными.

Следуя официальному документу, я мог бы успешно получать логи STDOUT в контроллерах, но невозможно, когда дело касается Джобса.

Вот мои примеры кодов.

Успешнопример в Controllers

class FormController extends Controller
{
    public function index(Request $request)
    {
        \Log::channel('stderr')->info('LOGGING TEST FROM CONTROLLER'); // This works perfectly as expected, i.e. visible with `docker-compose logs` command on the Host!
    }
}

Неудачный пример в Jobs

class SendMailJob implements ShouldQueue
{
    public function handle()
    {
        \Log::channel('stderr')->info('LOGGING TEST FROM JOB'); // This doesn't work X(
    }
}

Файл конфигурации супервизора

[program:form]
command=php /usr/local/laravel/artisan queue:work database --sleep=3 --tries=3
user=www-data
environment=HOME="/home/www-data",USER="www-data"
autostart=true
numprocs=2
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

Я бы добавил, что примеры контроллеров запускаются через браузеры (загрузка страниц), а задания выполняются через процесс супервизора (php artisan queue: work ...).

(И, в моем понимании, STDOUT внутриконтейнер будет отражен в журналах Docker. ... это правильно?)

Что я пробовал

  1. проверил указания официального документа -добавил \Log::channel('stderr')->info('TEST'); на контроллере и получил доступ к соответствующему маршруту, который был успешным.

  2. попробовал тот же метод в файлах заданий, который был неудачным.

  3. добавить exec('>&2 echo "TEST"'); в классе Работа: также не работает

  4. остановил Supervisor и вручную запустил php artisan queue:work после изменения текущего пользователя с root на www-data, который является программой, запускаемой пользователем, когда я загружаю страницы через браузер: фактически выводил журналы в командной строке, но невидим для команды docker-compose logs,* Процесс через Supervisor запускается с пользователем root по умолчанию, поэтому я изменил его на www-data в файле conf.Однако, как и в случае с пользователем root, это не решило проблему.

Я предполагаю, что использование Supervisor может быть причиной ... но на самом деле понятия не имеюясно.

Было бы замечательно, если бы я мог видеть все журналы из приложений Laravel, когда я запускаю команду docker-compose logs на хост-машине.В настоящее время команда показывает только журналы в файлах контроллера (то есть программы, которые должны запускаться через браузер).

Кто-нибудь может мне помочь?Буду очень признателен за любые предложения.

Спасибо!

1 Ответ

0 голосов
/ 19 июня 2019

Проблема решена. Вот что я сделал.

  1. Установить файл конфигурации супервизора следующим образом;
[program:php-fpm]
process_name=%(program_name)s_%(process_num)02d
command=php-fpm
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

[program:form]
process_name=%(program_name)s_%(process_num)02d
command=php /usr/local/laravel/artisan queue:work database --sleep=3 --tries=3
autostart=true
autorestart=true
numprocs=2
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
  1. Установите CMD ['/usr/bin/supervisord'] в Dockerfile и запустите docker-compose up -d.

  2. Пробная отправка задания, а затем docker-compose logs на хосте. Это показывало мне все логи от php-fpm или supervisor.

Как я уже прокомментировал, это может быть принципиально неприемлемой стратегией, хотя php-fpm и supervisor объединяются в одном контейнере.

...