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

Laravel x Docker:如何从排队作业中获取标准日志?,laravel,docker,logging,queue,stdout,Laravel,Docker,Logging,Queue,Stdout,我在php fpm上运行Laravel,docker由Nginx和MySQL组成。 我希望从主机上的docker compose logs命令中可以看到Laravel job中的所有日志,但仍然不成功 根据官方文件,我可以成功地在控制器中获取标准输出的日志,但在作业方面是不可能的 下面是我的示例代码 控制器中的成功示例 class FormController extends Controller { public function index(Request $request)

我在php fpm上运行Laravel,docker由Nginx和MySQL组成。 我希望从主机上的
docker compose logs
命令中可以看到Laravel job中的所有日志,但仍然不成功

根据官方文件,我可以成功地在控制器中获取标准输出的日志,但在作业方面是不可能的

下面是我的示例代码

控制器中的成功示例

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(
    }
}
工作不成功的例子

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(
    }
}
主管配置文件

[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队列:工作…)运行的

(据我所知,容器内的标准输出将反映到Docker日志中……这是正确的吗?)

我尝试过的

  • 检查了官方文件的说明-添加了
    \Log::channel('stderr')->info('TEST')并访问相应的路由,成功

  • 在作业文件中尝试了相同的方法,但未成功

  • 添加
    exec('>&2 echo“TEST”)在作业类中:也不起作用

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

  • 我想使用主管可能是原因。。。但实际上没有明确的想法

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

    有人能帮我吗? 任何建议都将不胜感激

    谢谢

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

  • 将supervisor conf文件设置为:
  • 在Dockerfile上设置
    CMD['/usr/bin/supervisord']
    ,然后运行
    docker compose up-d

  • 尝试分派作业,然后在主机上编写日志。 这显示了php fpm或supervisor的所有日志


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

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