在 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> <?phpfunction logErrorToFile(Exception $e) {
$logFile = DIR . '/error.log';
$logMessage = "[" . date('Y-m-d 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('Y-m-d 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 提供的异常处理机制,将为你的项目稳定性保驾护航。