介紹如何在 PHP 中使用 error_log
或 syslog
將各種錯誤、警告或通知訊息寫入系統設定檔中。
error_log
記錄錯誤訊息
PHP 的 error_log
函數可以用來將錯誤訊息寫入記錄檔,以下是使用範例。
# 將錯誤訊息寫入系統記錄檔 error_log("Error message.")
error_log
預設會將訊息遞送至 PHP 的 logger,跟 PHP 系統的訊息一起存入 error_log 所指定的位置。
若要將錯誤訊息直接以 Email 寄送至指定信箱,可以將第二個訊息類型參數設定為 1
,並在第三個參數指定 Email 信箱:
# 將錯誤訊息以 Email 寄送至指定信箱 error_log("Error message.", 1, "admin@example.com");
若要將錯誤訊息儲存至指定的檔案中,可以將第二個訊息類型參數設定為 3
,並在第三個參數指定記錄檔的路徑(必須具有寫入權限):
# 將錯誤訊息儲存至指定檔案 error_log("Error message.", 3, "/var/tmp/my-errors.log");
syslog
寫入系統記錄檔
PHP 的 syslog
函數可以將訊息遞送至作業系統的 logger,統一存放在作業系統的記錄檔中。
syslog
可以記錄各類型的訊息,依據嚴重程度將訊息區分為不同的層級,以下是訊息的分級表:
訊息層級 | 說明 |
---|---|
LOG_EMERG |
系統已經無法使用。 |
LOG_ALERT |
需要立即應變處理。 |
LOG_CRIT |
嚴重(critical)訊息。 |
LOG_ERR |
錯誤(error)訊息。 |
LOG_WARNING |
警告(warning)訊息。 |
LOG_NOTICE |
普通的關鍵訊息。 |
LOG_INFO |
普通訊息。 |
LOG_DEBUG |
除錯訊息。 |
在使用 syslog
記錄訊息時,需要搭配 openlog
函數與 closelog
函數開啟與關閉系統的 logger,以下是一個簡單的範例:
# 開啟 syslog,使用 MyScriptLog 作為識別字 openlog("MyScriptLog", 0, LOG_LOCAL0); # 將錯誤訊息遞送至 syslog syslog(LOG_ERR, "Error message."); # 關閉 syslog closelog();
在以 openlog
開啟系統的 logger 時,第三個參數需要指定處理訊息的 facility,在 Linux 系統下通常指定為 LOG_LOCAL0
即可,而若是 Windows 則可改用 LOG_USER
,其他還有許多可用的 facility 參數可參考 openlog
的說明文件。
若在 Linux 下執行上面這個 syslog
範例,預設就會將訊息記錄至 /var/log/syslog
這個記錄檔案中:
Dec 13 08:42:46 yourhost MyScriptLog: Error message.
由於我們在以 openlog
開啟系統的 logger 時,有指定以 MyScriptLog
作為識別字,所以在記錄檔中的每一筆記錄就都會有這個識別字,方便管理者查閱與搜尋。
syslog
嚴重訊息
依據作業系統的 syslog
設定,不同等級的訊息可能會有不同的處理方式,例如收到 LOG_EMERG
等級的訊息時,除了記錄在 /var/log/syslog
之外,系統還會送出廣播,通知所有線上的使用者。
# 送出最嚴重的訊息 syslog(LOG_EMERG, "Emergent message.");
當此訊息送出之後,每位線上的 Linux 使用者在終端機中都會收到類似這樣的廣播訊息:
Broadcast message from systemd-journald@yourhost (Sun 2020-12-13 08:49:45 CST): MyScriptLog[23939]: Emergent message.
參考資料:GeeksforGeeks