介紹如何在 PHP 中使用 error_logsyslog 將各種錯誤、警告或通知訊息寫入系統設定檔中。

error_log 記錄錯誤訊息

PHP 的 error_log 函數可以用來將錯誤訊息寫入記錄檔,以下是使用範例。

<?php
# 將錯誤訊息寫入系統記錄檔
error_log("Error message.")
?>

error_log 預設會將訊息遞送至 PHP 的 logger,跟 PHP 系統的訊息一起存入 error_log 所指定的位置。

若要將錯誤訊息直接以 Email 寄送至指定信箱,可以將第二個訊息類型參數設定為 1,並在第三個參數指定 Email 信箱:

<?php
# 將錯誤訊息以 Email 寄送至指定信箱
error_log("Error message.", 1, "admin@example.com");
?>

若要將錯誤訊息儲存至指定的檔案中,可以將第二個訊息類型參數設定為 3,並在第三個參數指定記錄檔的路徑(必須具有寫入權限):

<?php
# 將錯誤訊息儲存至指定檔案
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,以下是一個簡單的範例:

<?php
# 開啟 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 之外,系統還會送出廣播,通知所有線上的使用者。

<?php
# 送出最嚴重的訊息
syslog(LOG_EMERG, "Emergent message.");
?>

當此訊息送出之後,每位線上的 Linux 使用者在終端機中都會收到類似這樣的廣播訊息:

Broadcast message from systemd-journald@yourhost (Sun 2020-12-13 08:49:45 CST):

MyScriptLog[23939]: Emergent message.

參考資料