【问题标题】:Laravel x Docker : How can I have STDOUT log from queued jobs?Laravel x Docker:如何从排队的作业中获取 STDOUT 日志?
【发布时间】:2019-06-18 08:55:29
【问题描述】:

我在 php-fpm、docker-composed 上使用 Nginx、MySQL 运行 Laravel。 我想让 Laravel 作业的所有日志都可以从主机上的 docker-compose logs 命令中看到,但是仍然不成功。

按照官方文档,我可以在Controllers中成功获取STDOUT的日志,但对于Jobs却是不可能的。

这是我的示例代码。

控制器中的成功示例

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

我要补充一点,Controllers 的示例是通过浏览器运行的(加载页面),而 Jobs 是通过 Supervisor 进程运行的(php artisan queue:work...)。

(而且,据我了解,容器内的 STDOUT 会反映到 Docker 日志中。...这是正确的吗?)

我的尝试

  1. 查看官方文档说明-在Controller上添加\Log::channel('stderr')->info('TEST');并访问对应路由,成功。

  2. 在 Job 文件中尝试了相同的方法,但不成功。

  3. 在 Job 类中添加 exec('>&2 echo "TEST"');:也不起作用

  4. 在将当前用户从root 更改为www-data 后,停止了Supervisor 并手动运行php artisan queue:work,这是我通过浏览器加载页面时运行程序的用户:实际上确实在命令行中输出了日志,但是从docker-compose logs 命令不可见。 *默认情况下,通过 Supervisor 的进程以用户 root 运行,因此我在 conf 文件中将其更改为 www-data。但是,与用户 root 一样,这并没有解决问题。

我假设使用 Supervisor 可能是原因......但实际上并没有明确的想法。

当我在主机上运行docker-compose logs 命令时,如果我能看到来自 Laravel 应用程序的所有日志,那就太好了。 目前,该命令仅显示控制器文件中的日志(即通过浏览器访问运行的程序)。

谁能帮帮我? 任何建议将不胜感激。

谢谢!

【问题讨论】:

  • 我可以通过在/etc/supervisor/supervisord.conf 文件中设置nodaemon=true 来解决它。但是,这种方法禁用 php-fpm 来输出日志......我相信将两个不同的系统 - php-fpm 和主管 - 打包在一个容器中是违反 Docker 理念的。答案可能是,不要在同一个容器上同时使用 supervisor 和 php-fpm...

标签: laravel docker logging queue stdout


【解决方案1】:

问题已解决。 这就是我所做的。

  1. 将 supervisor conf 文件设置为这样;
[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. 在 Dockerfile 上设置 CMD ['/usr/bin/supervisord'] 并运行 docker-compose up -d

  2. 尝试了作业调度,然后在主机上docker-compose logs。 这向我显示了来自 php-fpm 或主管的所有日志。

正如我所评论的,将 php-fpm 和 supervisor 放在同一个容器上可能是根本不受欢迎的策略。

【讨论】:

    猜你喜欢
    • 2017-03-12
    • 1970-01-01
    • 2017-01-08
    • 2021-12-18
    • 2015-10-03
    • 2015-11-03
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多