日志是一個可靠系統的重要保障之一。完整的日志記錄,能夠極大地幫助我們分析問題,排查錯誤。
在這里,介紹一下 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
,表示日志文件。
一般來說,默認配置情況下即可實現日志的記錄。