为什么 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 错误。
当我的网站出错时,我正试图获得更多关于生产的信息。场景是这样的:
我们与 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 错误。