在PHP 開發中,錯誤日誌記錄是保障程序穩定性和排查問題的重要手段。雖然PHP 自帶了error_log和set_error_handler等機制,但我們有時希望能夠自定義錯誤信息的輸出格式,特別是在涉及堆棧跟踪信息時。 Exception類中的getTraceAsString()方法可以幫助我們實現這一目標。
getTraceAsString()是PHP 中Exception類的一個方法,用於返回異常的堆棧跟踪信息的字符串表示。該字符串包含函數調用的順序、文件名和對應的行號,非常適合用於記錄日誌。
示例輸出如下:
#0 /var/www/html/index.php(10): someFunction()
#1 {main}
我們可以通過捕獲異常( try...catch ) 並調用getTraceAsString() ,來將錯誤信息格式化後寫入日誌文件。下面是一個完整的例子:
<code> <?php function logErrorToFile(Exception $e) {
$logFile = DIR . '/error.log';
$logMessage = "[" . date('Ymd H:i:s') . "] ";
$logMessage .= "Error: " . $e->getMessage() . PHP_EOL;
$logMessage .= "In file: " . $e->getFile() . " on line " . $e->getLine() . PHP_EOL;
$logMessage .= "Stack trace:" . PHP_EOL . $e->getTraceAsString() . PHP_EOL;
$logMessage .= str_repeat("-", 80) . PHP_EOL;
file_put_contents($logFile, $logMessage, FILE_APPEND);
}
function divide($a, $b) {
if ($b === 0) {
throw new Exception("除數不能為0");
}
return $a / $b;
}
try {
$result = divide(10, 0);
} catch (Exception $e) {
logErrorToFile($e);
echo "發生錯誤,請查看日誌文件。" . PHP_EOL;
}
</code>
有時候我們希望將錯誤日誌發送到遠程服務器進行統一管理。在這種情況下,可以使用file_get_contents或curl將日誌信息推送到遠程接口,例如:
<code> function sendErrorToRemote(Exception $e) { $log = [ 'time' => date('Ymd H:i:s'), 'message' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine(), 'trace' => $e->getTraceAsString() ]; $json = json_encode($log);
$ch = curl_init('https://gitbox.net/api/error-report');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
}
</code>
日誌輪轉:確保日誌文件不會無限增大,可以結合logrotate 工具或在PHP 中設置文件大小檢查。
錯誤級別區分:根據異常類型或自定義級別記錄不同嚴重程度的日誌。
安全性:避免記錄敏感信息,如數據庫密碼或用戶隱私數據。
使用getTraceAsString()可以快速將異常的調用棧信息轉換為可讀字符串,結合自定義日誌函數可以實現靈活的錯誤日誌記錄機制。這不僅方便本地調試,也能滿足遠程監控和告警的需求。靈活使用PHP 提供的異常處理機制,將為你的項目穩定性保駕護航。