【问题标题】:Laravel 7.x Production Not Logging HTTP 500 ExceptionLaravel 7.x 生产未记录 HTTP 500 异常
【发布时间】:2020-12-09 13:27:42
【问题描述】:

Laravel 似乎存在一个长期存在的问题,无法在生产环境中正确登录。我有一个使用 Docker-compose 制作 web、队列和调度程序服务的小型应用程序。在生产环境中测试这个小应用程序(目前没有用户,所以我可以做一些破坏性调试而不用担心太多),我在尝试访问页面时遇到了 HTTP 500 错误。检查我的 web/laravel.log 文件,过去一个月没有输出。我尝试删除日志文件,并再次点击页面的 500 错误。没有创建文件。

进入 Web Service 容器并运行 tinker 并执行以下操作:

Log::debug("HELLO, World?");

用一行文字创建了 Web/Laravel.log 文件

[2020-08-19 17:51:36] production.DEBUG: HELLO, World?

有几件事:

  1. 每个 docker 重建、我的缓存、配置等都是从主机上的基础项目重建的,容器只有卷用于日志文件,所以缓存或重置可能不是问题(我会解释如下)。
  2. Log::debug("message") 按预期工作的事实表明这不是 PATH 问题,也不是权限问题。
  3. 我只需要对队列服务进行大量调试,在此期间我经常使用 Queue/laravel.log 文件。据我所知,队列服务毫无问题地记录了异常。由于队列服务和 Web 服务是由完全相同的基础项目制成的,具有完全相同的步骤,唯一的区别是执行命令。
  4. 我尝试在我的开发环境中将 APP_DEBUG 和 APP_ENV 分别更改为 false 和 production,但在我的开发环境中仍然得到正确的输出。

似乎还有很多其他形式存在同样的问题,但都没有给出正确的解决方案。使用This Thread 我能够看到错误消息

"Property [permissioned_users] does not exist on this collection instance."

这很容易找到问题并解决。但是,如果我将来遇到 500 问题,我希望它记录下来,以便我知道发生了什么,所以我想完全解决这个问题并深入了解它。 关于这个问题的以下线程没有给出官方解决方案:

Laravel log errors in production

Laravel 5.8 Log levels are not working

App Debug Not Working in Laravel 5.8

Log info not working

Laravel 5.3 Logging not working

这些旧解决方案中的许多都建议设置“APP_LOG_LEVEL”,这似乎在 Laravel 5.6 中已被贬低。 (Unrelated - Reimplementation of this here?)

目前,我的解决方案似乎类似于将以下行添加到 App\Exception\Handler 第 37 行(而不是上面首先帮助我调试的 dd($e->getMessage() ):

if(config('app.env') == "production" && env('CONTAINER_ROLL') == "web-server"){ Log::error("PRODUCTION WEB EXCEPTION : " . $exception->getMessage()); }

但我宁愿找出根本问题并彻底解决这个问题。

在编写此消息时,我发现了根本问题(权限问题)。请参阅下文了解我的特定(Docker)问题

【问题讨论】:

    标签: laravel docker logging docker-compose permissions


    【解决方案1】:

    这是一个 Docker 和权限问题。

    在我的 Web 服务 Dockerfile 中,我有以下行:

    RUN chown -R www-data:www-data /app/storage/
    

    在检查我的网络服务的日志文件后,我发现了以下内容:

    drwxrwxr-x 1 www-data www-data   4096 Jun 17  2019 storage
    
    drwxrwxr-x 1 www-data www-data 4096 Jun 17  2019 app
    drwxrwxr-x 1 www-data www-data 4096 Jun 11 08:15 framework
    drwxr-xr-x 2 root     root     4096 Aug 19 08:51 logs
    
    -rw-r--r-- 1 root     root     1353 Aug 20 03:13 laravel.log
    

    运行命令

    chown -R www-data:www-data ./storage/logs/
    

    解决了问题,并在日志中显示了我的 500 HTTP 错误!

    任务完成!

    附加说明,供在这部分仍需要解释的任何人使用。

    Apache Web 服务器需要 www-data (dockerfile FROM php:7.4-apache) 。运行 PHP (laravel) 应用程序的 Apache 服务器是 www-data ,它需要写入日志文件的权限。我你 BASH 进入容器,你以 root 身份运行,所以如果你从 Tinker 执行 Log::debug() ,它将由 root 用户执行。对于队列和调度程序(dockerfile FROM php:7.4 ,运行 CRON 或 Artisan Worker),它们也都以 root 用户身份执行,而不是 apache。

    跟进此事,

    我确实注意到了一些有趣的工件,并且能够重新创建它。问题是数量。 HOST VOLUME 文件将覆盖容器的文件,因此应用程序的文件(被复制到 Docker 容器中)将被覆盖并且不受影响。另外值得注意的是,修改容器内的卷文件(包括所有权和权限)将修改主机上的卷文件,反之亦然。问题是我的主机端卷文件web/laravel.log 有@最初是 987654325@ 所有权,它链接到 web-service Container 。因此,尽管对这个文件执行了 Dockerfile chown 命令,但它会被这个 Volume 的 Host 文件覆盖,这将使它无法工作。运行

    chown -R www-data:www-data storage/logs/
    

    在 web-service 容器中修改了 Host 的 File 为 www-data 的所有权。由于主机卷文件现在是 www-data 所有权,Docker-compose 重建和刷新从那里开始工作。但是,如果我退出容器(当容器仍在运行时)并在主机卷日志文件上执行相反的命令

    chown -R root:root logs/web/
    

    (其中 web/laravel.log 存在),它会立即将 web-service 容器的文件(返回检查)再次更改为 root:root ,这会阻止 apache 的日志记录正常工作。

    注意以下几点:

    主机申请:

    drwxrwxr-x  5 root www-data   4096 Jun 17  2019 storage
    
    drwxrwxr-x  3 root www-data 4096 Jun 17  2019 app
    drwxrwxr-x  6 root www-data 4096 Jun 11 08:15 framework
    drwxrwxr-x  2 root root     4096 Nov 21  2019 logs
    
    -rwxrwxr-x 1 root root     1657039 Jun 28 05:29 laravel.log <<<< Irrelevant due to Volume
    

    主机网络容器:

    drwxrwxr-x 1 www-data www-data   4096 Jun 17  2019 storage
    
    drwxrwxr-x 1 www-data www-data 4096 Jun 17  2019 app
    drwxrwxr-x 1 www-data www-data 4096 Jun 11 08:15 framework
    drwxr-xr-x 2 www-data www-data 4096 Aug 20 05:21 logs
    
    -rw-r--r-- 1 www-data www-data 19840 Aug 20 06:02 laravel.log <<<< Linked to Host by Volume
    

    主机网络日志卷位置:

    drwxr-xr-x  2 www-data www-data 4096 Aug 20 05:21 web
    
    -rw-r--r-- 1 www-data www-data 19840 Aug 20 06:02 laravel.log <<<< Linked to Container by Volume
    

    主机队列容器:

    drwxrwxr-x 3 root root 4096 Jun 17  2019 app
    drwxrwxr-x 1 root root 4096 Jun 11 08:15 framework
    drwxr-xr-x 2 root root 4096 Jun 11 12:26 logs
    
    -rw-r--r-- 1 root root 322662871 Aug 20 08:01 laravel.log <<<< Linked to Host by Volume
    

    主机队列日志卷位置:

    drwxr-xr-x  2 root     root     4096 Jun 11 12:26 queue
    
    -rw-r--r-- 1 root root 322662871 Aug 20 08:01 laravel.log <<<< Linked to Container by Volume
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-05
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 2015-09-26
      • 1970-01-01
      相关资源
      最近更新 更多