詳細說明 PHP error_log() 函數的四種訊息類型參數、自訂日誌檔案路徑、郵件發送、系統日誌等輸出目的地,並提供生產環境除錯實戰範例與最佳實務建議。
bool error_log(string $message, int $message_type = 0, string $destination = '', string $extra_headers = '')
| 類型 | 參數值 | 輸出目的地 | 說明 |
|---|---|---|---|
| 0 | 0 | PHP 系統錯誤日誌 | 依 php.ini error_log 設定,或 Web Server 錯誤日誌 |
| 1 | 1 | Email 郵件 | 發送至 $destination 指定信箱,需 $extra_headers 設定 From/Subject |
| 3 | 3 | 自訂檔案 | 追加寫入 $destination 指定檔案路徑 |
| 4 | 4 | SAPI 日誌 | 直接輸出至 Web Server (Apache/Nginx) 錯誤日誌流 |
<?php
if (!empty($_POST)) {
foreach ($_POST as $key => $val) {
// 類型 3:寫入自訂日誌檔
error_log("[$key] => $val", 3, '/var/log/myapp/post_debug.log');
}
}
?>
<?php
function log_debug(array $context, string $message = '') {
$entry = [
'time' => date('c'),
'ip' => $_SERVER['REMOTE_ADDR'] ?? 'cli',
'uri' => $_SERVER['REQUEST_URI'] ?? '',
'message' => $message,
'context' => $context,
];
error_log(json_encode($entry, JSON_UNESCAPED_UNICODE) . "\n", 3, '/var/log/myapp/debug.log');
}
// 使用
log_debug($_POST, '收到表單提交');
log_debug(['user_id' => 123, 'action' => 'purchase'], '用戶購買');
?>
<?php
$msg = "嚴重錯誤:資料庫連線失敗\n時間: " . date('c');
$headers = "From: system@example.com\r\nSubject: [ALERT] 系統錯誤通知";
error_log($msg, 1, 'admin@example.com', $headers);
?>
logrotate 定期切割、壓縮、清理舊日誌,防止磁碟爆滿。www-data),建議 chmod 755 目錄、644 檔案。open_basedir 限制、磁碟空間。JSON_UNESCAPED_UNICODE。php.ini SMTP/sendmail_path 設定正確,檢查郵件佇列。善用 error_log() 並配合結構化日誌、輪轉策略,能大幅提升問題排查效率與系統可觀測性。