日志是一个可靠系统的重要保障之一。完整的日志记录,能够极大地帮助我们分析问题,排查错误。
在这里,介绍一下 PHP 的日志相关的一些配置和内容。
本文以 PHP 7 版本作为描述的基础。
基本
在 php.ini 配置文件中,有一个名为 display_errors
的配置,这个配置决定了是否显示错误信息。一般来说,在开发测试阶段,这个配置应该保持 On
以方便查看问题;当在线上时,这个应设置为 Off
,避免向用户显示出内部具体的错误信息。
比如我们直接在 CLI 里执行 php -r "echo 1 / 0;"
,当配置了 On
时,即可看见这样的错误信息:
➜ php -r "echo 1 / 0;"
Warning: Division by zero in Command line code on line 1
Call Stack:
0.0001 349088 1. {main}() Command line code:0
INF
当然,如果我们在 Web 中运行该代码,也会显示类似错误。
实践
那当我们在线上将 display_errors
配置设为 Off
时,我们又怎样跟踪错误呢?这个时候,就要用到下面两个配置:
-
log_errors
,表示是否记录错误日志,默认为Off
。当该值为On
时,将使用下面的配置error_log
的值作为日志文件。 -
error_log
,指定日志文件。执行 PHP 代码的用户,需要有该文件的写权限。在 CLI 里执行 PHP 的用户与 PHP-FPM 的执行用户可能不同,请特别留意因为不同用户产生的文件写权限的问题。
现在我们把 log_error
设为 On
,error_log
设为 /tmp/log/php_errors.log
,然后再次在 CLI 里执行 php -r "echo 1 / 0;"
,即可在指定的文件中查看到相关错误信息。
对于该日志文件,如果有需要可以使用 logrotate 来实现日志切割。
PHP-FPM
当我们使用 PHP-FPM 来运行 PHP 的时候,就要额外留意 FPM 里的配置。
-
catch_workers_output
,表示是否把 fpm worker 的 stderr 和 stdout 重定向错误日志中; -
error_log
,表示日志文件。
一般来说,默认配置情况下即可实现日志的记录。