日志是一個(gè)可靠系統(tǒng)的重要保障之一厉熟。完整的日志記錄,能夠極大地幫助我們分析問題廉丽,排查錯(cuò)誤。
在這里妻味,介紹一下 PHP 的日志相關(guān)的一些配置和內(nèi)容正压。
本文以 PHP 7 版本作為描述的基礎(chǔ)。
基本
在 php.ini 配置文件中责球,有一個(gè)名為 display_errors
的配置焦履,這個(gè)配置決定了是否顯示錯(cuò)誤信息。一般來說雏逾,在開發(fā)測試階段嘉裤,這個(gè)配置應(yīng)該保持 On
以方便查看問題;當(dāng)在線上時(shí)栖博,這個(gè)應(yīng)設(shè)置為 Off
屑宠,避免向用戶顯示出內(nèi)部具體的錯(cuò)誤信息。
比如我們直接在 CLI 里執(zhí)行 php -r "echo 1 / 0;"
笛匙,當(dāng)配置了 On
時(shí)侨把,即可看見這樣的錯(cuò)誤信息:
? 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
當(dāng)然,如果我們在 Web 中運(yùn)行該代碼妹孙,也會顯示類似錯(cuò)誤。
實(shí)踐
那當(dāng)我們在線上將 display_errors
配置設(shè)為 Off
時(shí)获枝,我們又怎樣跟蹤錯(cuò)誤呢蠢正?這個(gè)時(shí)候,就要用到下面兩個(gè)配置:
-
log_errors
省店,表示是否記錄錯(cuò)誤日志嚣崭,默認(rèn)為Off
。當(dāng)該值為On
時(shí)懦傍,將使用下面的配置error_log
的值作為日志文件雹舀。 -
error_log
,指定日志文件粗俱。執(zhí)行 PHP 代碼的用戶说榆,需要有該文件的寫權(quán)限。在 CLI 里執(zhí)行 PHP 的用戶與 PHP-FPM 的執(zhí)行用戶可能不同寸认,請?zhí)貏e留意因?yàn)椴煌脩舢a(chǎn)生的文件寫權(quán)限的問題签财。
現(xiàn)在我們把 log_error
設(shè)為 On
,error_log
設(shè)為 /tmp/log/php_errors.log
偏塞,然后再次在 CLI 里執(zhí)行 php -r "echo 1 / 0;"
唱蒸,即可在指定的文件中查看到相關(guān)錯(cuò)誤信息。
對于該日志文件灸叼,如果有需要可以使用 logrotate 來實(shí)現(xiàn)日志切割神汹。
PHP-FPM
當(dāng)我們使用 PHP-FPM 來運(yùn)行 PHP 的時(shí)候庆捺,就要額外留意 FPM 里的配置。
-
catch_workers_output
屁魏,表示是否把 fpm worker 的 stderr 和 stdout 重定向錯(cuò)誤日志中疼燥; -
error_log
,表示日志文件蚁堤。
一般來說醉者,默認(rèn)配置情況下即可實(shí)現(xiàn)日志的記錄。