gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 19:57:54 24 4
gpt4 key购买 nike

我在php-fpm上运行Laravel,docker由Nginx,MySQL组成。
我想让Laravel作业的所有日志在主机上的docker-compose logs命令中可见,但是仍然失败。

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

这是我的示例代码。

Controller 中的成功示例

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(
}
}

主管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会反射(reflect)到Docker日志中。...正确吗?)

我尝试过的
  • 检查了官方文档的指示-在Controller上添加了\Log::channel('stderr')->info('TEST');并访问了相应的路由,成功了。
  • 在Job文件中尝试了相同的方法,但未成功。
  • 在Job类中添加exec('>&2 echo "TEST"');:也不起作用
  • 在将当前用户从php artisan queue:work更改为root后停止了Supervisor,并手动运行了www-data,这是我通过浏览器加载页面时正在运行的用户程序:确实在命令行中放置了日志,但是从docker-compose logs命令中看不到日志。
    *默认情况下,通过Supervisor进行的处理是使用用户root运行的,因此我在conf文件中将其更改为www-data。但是,就像用户root一样,这不能解决问题。

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

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

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

    谢谢!

    最佳答案

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

  • 设置主管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
  • 在Dockerfile上设置CMD ['/usr/bin/supervisord']并运行docker-compose up -d
  • 尝试调度作业,然后在主机上尝试docker-compose logs
    这向我显示了来自php-fpm或 super 用户的每个日志。

  • 正如我已经评论过的,虽然将php-fpm和 super 用户放到同一容器中,这可能是根本不受欢迎的策略。

    关于laravel - Laravel x Docker:如何从排队的作业中获取STDOUT日志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56645285/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com