Laravel x Docker:如何从排队的作业中获取STDOUT日志?

时间:2019-06-18 08:55:29

标签: laravel docker logging queue stdout

我正在使用Nginx,MySQL在php-fpm, docker-composed 上运行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!
    }
}

乔布斯中的失败示例

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

Supervisor conf文件

[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. 停止了Supervisor,并在将当前用户从php artisan queue:work更改为root后手动运行www-data,这是我通过浏览器加载页面时正在运行的用户程序:实际上已退出登录命令行,但从docker-compose logs命令中看不到。 *默认情况下,通过Supervisor进行的处理是由用户root运行的,因此我在conf文件中将其更改为www-data。但是,就像用户root一样,这不能解决问题。

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

当我在主机上运行docker-compose logs命令时,如果能从Laravel应用程序中看到所有日志,那将是很棒的。 当前,该命令仅显示Controller文件(即通过浏览器访问运行的程序)中的日志。

有人可以帮助我吗? 任何建议将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:0)

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

  1. 将超级用户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和超级用户放到同一容器中可能根本上是不受欢迎的策略。