为什么 Symfony 在没有 Monolog 向日志文件写入任何内容的情况下死于 500 错误?

Why Symfony dies with a 500 error without Monolog writing anything to the log file?

当我的网站出错时,我正试图获得更多关于生产的信息。场景是这样的:

我们与 stripe 和 stripe webhooks 集成以进行某些调用。当条带函数失败时,我们没有任何信息来了解生产服务器上出了什么问题。目前条纹 returns 这种错误:

这肯定没有帮助,但我希望 var/log/prod.log 文件中的 prod.log 文件会有信息。我看了一下,它是空的(不理想 - 现在我们根本不知道问题出在哪里)。

我的monolog.yaml生产文件如下:

monolog:
    handlers:
        filter_for_errors:
            type: fingers_crossed
            # if *one* log is error or higher, pass *all* to file_log
            action_level: error
            handler: file_log

        # now passed *all* logs, but only if one log is error or higher
        file_log:
            type: stream
            path: "%kernel.logs_dir%/%kernel.environment%.log"

        # still passed *all* logs, and still only logs error or higher
        syslog_handler:
            type: syslog
            level: error

这是标准的,直接来自文档,但是,似乎没有任何内容写入该文件。

我正在检查该文件的权限:

-rw-r--r-- 1 deploy www-data 488007 Mar  2 19:21 prod.log

这些权限正确吗?

我的 nginx 服务器块配置是否也需要指向正确的文件,或者 symfony 是否足够?

该文件应该可以由拥有网络服务器进程的同一用户写入。通常www-data,但请检查您的服务器配置。

通常 var 下的所有内容都应该可以被 web-server 进程写入。

检查关于 the recommended directory permissions Symfony 项目的文档始终是一个推荐的操作过程,以防有疑问。

此外,尝试在开发和生产中尽可能接近地复制生产环境。如果您在开发中重现此问题,您可以在 PHP 上启用 display_errors,然后您会看到最终原因。


这里发生的事情是,当任何触发写入日志的事情发生时,应用程序将遇到致命错误,因为它无法写入日志文件。因此,即使原始错误是 non-fatal,即使是警告或信息性错误,它也会升级为 500,因为无法写入应用程序期望的位置,它是 non-recoverable 错误。