【问题标题】:Laravel logging not working from job handle methodLaravel 日志记录无法通过作业句柄方法工作
【发布时间】:2020-11-07 07:36:37
【问题描述】:

我无法使用 Log 外观从 Job 的 handle 方法记录任何内容。使用此外观从控制器或应用程序的其他部分进行日志记录工作正常。

我在这里尝试了解决方案:Logging not working in laravel queue job,但它不适用于 Laravel 6.17,在这里:https://stackoverflow.com/a/55206727/10767428,但它不会以任何方式影响行为。

  • PHP 7.2
  • Laravel 6.17
  • APP_ENV=local
  • APP_LOG_LEVEL=debug
  • Laravel 在 Docker 中运行,使用 Alpine 映像和其他不相关的东西

这是我的工作:

class MyJob implements ShouldQueue
{
    use Dispatchable;
    use InteractsWithQueue;
    use Queueable;
    use SerializesModels;

    public function handle()
    {
       Log::warning("HI");
    }
}

当我发送 if 时,作业得到了正确处理,但我的 storage/app/logs/laravel.log 中没有显示任何内容。

这个文件和整个文件夹storage有777个权限。

我在config/logging.php 中使用“单一”驱动程序:

        'single' => [
            'driver' => 'single',
            'path' => storage_path('logs/laravel.log'),
            'level' => 'debug',
        ],

有什么想法吗?

编辑 2020 年 7 月 17 日

根据要求,这是我的config.horizon.php

https://pastebin.com/jkQLcDKF

编辑 07/20/2020

当我使用dipatchNow 方法而不是dispatch 调用它时,我可以从同一个作业登录。任何想法为什么?

【问题讨论】:

  • 你是如何初始化worker的?
  • 我不知道你的 docker 镜像,你试过 docker logs 许多 docker 镜像将默认日志文件重定向到 stderr ......所以也许,不相关的东西可能是相关的
  • 如果你已经以 php artisan queue:work 运行 worker,如果你修改了配置,它需要重新启动。您使用的是什么队列连接(驱动程序)?
  • 我在这里和@DannyEbbers 在一起,我认为这是一个 docker 配置问题。我会检查以确保您使用 app/storage 作为容器的共享卷。
  • 谢谢你们@DannyEbbers、Kurt Friars 和 N69S,让我试试你们的建议,如果我得到结果我会告诉你们的。我使用 Horizo​​n 让 worker 运行,所以我使用 php artisan horizon 启动 worker。我认为 Horizo​​n 负责重新启动工作人员,但我会尝试手动重新启动它。队列连接为redisrabbitmq,具体取决于作业。但他们都没有记录任何东西。

标签: php laravel permissions


【解决方案1】:

如果其他人遇到问题,则必须在对作业进行更改时重新启动 Horizo​​n。否则,运行的作业将不会反映您的代码更改。

这与环境无关。这就是为什么在重新部署到服务器时重新启动 Horizo​​n 是个好主意。

【讨论】:

    【解决方案2】:

    如果您的队列在 Supervisor 上运行,您的日志将在 Supervisor 日志中。如果找不到,请分享您的队列/主管配置。 您也可以检查您的 docker 日志。

    【讨论】:

    • 谢谢@sykez。我目前没有运行主管,因为我只在本地工作以进行开发。我只是从项目容器中启动 php artisan horizon 并将这个过程保持在我的终端的前台。我检查了 docker 日志,但我只收到 http 调用,没有自定义消息或 php 异常。我会继续寻找。
    • @vittorio 我明白了。这么晚才回复很抱歉。您是否能够确认您已派遣的作业是否已执行?在运行 Horizo​​n 或 Horizo​​n 仪表板的前台终端上看到任何输出吗?另外,您的工作是如何分派的,通过 tinker、http 请求、cron/schedule 调用?我假设您的QUEUE_DRIVER 已经设置为redis,对吗?如果您最近更改了此设置,也许您需要使用php artisan config:clear 清除缓存。当你使用dipatchNow时,基本上它是同步运行的(就像同步驱动一样)。
    • 谢谢@sykez。是的,我可以确认我已分派的作业已执行,因为 Horizo​​n 将它们显示在“最近的作业”部分,并且我在数据库中看到了预期的结果(作业在数据库中执行了一些更新)。是的,我在终端上看到了来自 Horizo​​n 的输出(诸如“处理 MyJob ... 处理 MyJob”等内容)。当我从工作中进行 var_dump 时,我会在终端中获得输出(在与 Horizo​​n 运行相同的 TTY 中)。出于测试目的,我通过一个简单的 API 调用(即通过 http 请求)调度作业。但是当我从 smw else 发送它们时,我得到了相同的结果。是的,QUEUE_DRIVER 设置为“redis”。
    • @vittorio 我明白了。我建议设置 Supervisor 来运行你的 Horizo​​n。我相信它可能会有所帮助:)
    • 好吧@sykez,我会尝试你的建议。现在,我还在本地。一旦我与主管一起进行生产,我会看看它是否会改变。如果是,我会将您的回复标记为已接受。感谢您的帮助。
    猜你喜欢
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    相关资源
    最近更新 更多