在一些公司裏面,有專門的日誌收集系統,日誌收集系統會在背後默默的幫你收集錯誤、警告、提示。
也有些公司沒有專門的日誌收集系統,通過文件來記錄服務器當中的運行日誌。
其中:PHP的錯誤,警告這些是必須要收集的。
那麼問題來了,不讓用戶看到,設置好錯誤報告級別,如何講錯誤收集到日誌系統中呢?
這裏需要使用到php.ini的相關配置項,這兩個配置項爲:
參數 | 配置項 | 說明 |
---|---|---|
log_errors |
On/off | 是否開啓日誌記錄 |
log_errors_max_len |
整型,默認1024 | 單行錯誤最大記錄長度 |
error_log |
syslog或者指定路徑 | 錯誤日誌記錄在什麼地方 |
說明:
- 在表格中的
log_errors
和log_errors_max_len
非常好理解。 - 而
error_log
指定講錯誤存放在什麼路徑上,配置項中的syslog可能有點不太好理解。syslog是指系統來記錄。windows系統在電腦的日誌收集裏面,linux默認在:/etc/syslog.conf
【擴展】若Linux系統啓動或修改了日誌收集,可能存儲在第三方專用的日誌收集服務器中。
此外,PHP還爲我們專門準備了一個自定義的錯誤日誌函數:
bool error_log (string $錯誤信息[int $錯誤消息類型 = 0 [string $存儲目標]])
這個函數可以把錯誤信息發送到web服務器的錯誤日誌,或者到一個文件裏。
常用的錯誤消息類型:
類型 | 說明 |
---|---|
0 | 發送至默認的error_log 指定位置 |
1 | 發送到指定的郵件位置(不熟悉可以不用看) |
3 | 發送到指定的文件位置 |
--------------------
補充部分:
--------------------
看到有說:
nginx只對頁面的訪問做access記錄日誌。不會有php的error log 信息。nginx把對php的請求發給php-fpm fastcgi進程來處理,默認的php-fpm只會輸出php-fpm的錯誤信息,在php-fpm的errors log裏也看不到php的errorlog。
原因是php-fpm的配置文件php-fpm.conf中默認是關閉worker進程的錯誤輸出,直接把他們重定向到/dev/null,所以我們在nginx的error log 和php-fpm的errorlog都看不到php的錯誤日誌。
所以我們要進行如下的設置就能查看到nginx下php-fpm不記錄php錯誤日誌的方法
修改 php-fpm.conf 文件,添加(或修改)如下配置:
[global]
error_log = log/error_log
[www]
catch_workers_output = yes
修改 php.ini 文件,添加(或修改)如下配置:
log_errors = On
error_log = "/usr/local/lnmp/php/var/log/error_log"
error_reporting=E_ALL&~E_NOTICE
----------------------------------------
個人測試後發現:
-----------------------------------------
根據個人的測試,發現,php-fpm中的www.conf文件中的:
[www] catch_workers_output = yes
設置yes或者on 沒有起任何作用
對於nginx 和php-fpm 和php三者來說:
php.ini中設置了error_log的保存路徑後,如果這裏設置的路徑爲無效(自帶的 error_log =syslog 測試後是無效的路徑,如果設置瞭如 error_log = /var/log/php.error.log 這樣的路徑,請保證這個文件確實存在並且有寫入權限,否則仍然是無效的路徑,php進程不會自動創建這個文件的),
那麼錯誤就會被打印到nginx的 error_log所指向的路徑中!如果設置的路徑有效,則打印到這裏設置的地方!
php-fpm在記錄錯誤的這個環節並沒有啓動任何作用!