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

标签 laravel docker logging queue stdout

我在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/

    相关文章:

    php - 如何在 Laravel 5 中编写单独的日志文件?

    java - 获得有关每个抛出的异常(甚至已处理的异常)的通知

    php - Laravel 5.2 关系 hasMany 与另一个唯一标识符

    laravel livewire 提交表单后返回空白页

    php - Laravel4 验证器和可空字段

    docker - 如何通过 SSH 连接到多容器 Azure 应用服务中的不同容器

    python - 如何在 nginx docker 和 uwsgi docker 之间共享 .sock 文件?

    java - 获取 MongoCommandException : Command failed with error 18 (AuthenticationFailed): 'Authentication failed.' on server localhost:27017

    c - ap_log_error 没有登录我的 apache 模块

    php - Laravel 5.1 auth attempt with extra parameters using default auth controller and middleware