如何在PHP错误日志中记录触发错误的URL?
PHP错误日志添加请求URL的两种方案
一、通过配置自定义错误日志格式(推荐)
PHP 5.3及以上版本支持通过error_log指令结合预定义变量自定义日志格式,直接将请求URL写入日志。
你可以在php.ini(或.htaccess、user.ini,取决于运行环境)中设置:
error_log = /path/to/your/error.log log_errors = On error_log_format = "[%t] %e: %m in %f on line %l | Request URL: %{REQUEST_URI}e"
关键变量说明:
%t:错误发生的时间戳%e:错误级别(如E_WARNING、E_ERROR)%m:错误信息%f:触发错误的脚本文件路径%l:错误所在行号%{REQUEST_URI}e:获取当前请求的URI(即URL路径部分)
若需记录完整域名+URL,可结合%{HTTP_HOST}e:
error_log_format = "[%t] %e: %m in %f on line %l | Full URL: %{HTTP_HOST}e%{REQUEST_URI}e"
修改配置后需重启Web服务(如Apache、Nginx)或PHP-FPM生效。
二、自定义错误处理函数记录URL
如果PHP版本低于5.3,或无法修改全局配置,可通过自定义错误处理函数手动记录URL。
基础错误捕获示例
// 自定义错误处理函数 function customErrorHandler($errno, $errstr, $errfile, $errline) { // 拼接完整请求URL $fullUrl = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; // 组装日志内容 $logMessage = sprintf( "[%s] Error level: %s | Message: %s | File: %s | Line: %d | Request URL: %s\n", date('Y-m-d H:i:s'), getErrorLevelName($errno), $errstr, $errfile, $errline, $fullUrl ); // 写入日志文件 error_log($logMessage, 3, '/path/to/your/error.log'); // 如需保留默认错误处理,取消下方注释 // return false; } // 辅助函数:将错误级别常量转为可读名称 function getErrorLevelName($errno) { $levelMap = [ E_ERROR => 'E_ERROR', E_WARNING => 'E_WARNING', E_PARSE => 'E_PARSE', E_NOTICE => 'E_NOTICE', E_CORE_ERROR => 'E_CORE_ERROR', E_CORE_WARNING => 'E_CORE_WARNING', E_COMPILE_ERROR => 'E_COMPILE_ERROR', E_COMPILE_WARNING => 'E_COMPILE_WARNING', E_USER_ERROR => 'E_USER_ERROR', E_USER_WARNING => 'E_USER_WARNING', E_USER_NOTICE => 'E_USER_NOTICE', E_STRICT => 'E_STRICT', E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR', E_DEPRECATED => 'E_DEPRECATED', E_USER_DEPRECATED => 'E_USER_DEPRECATED' ]; return $levelMap[$errno] ?? 'UNKNOWN_ERROR'; } // 注册自定义错误处理函数 set_error_handler("customErrorHandler");
致命错误补充捕获
set_error_handler无法捕获致命错误,需结合register_shutdown_function处理:
function handleFatalError() { $error = error_get_last(); if ($error && in_array($error['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING])) { $fullUrl = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; $logMessage = sprintf( "[%s] Fatal Error: %s | File: %s | Line: %d | Request URL: %s\n", date('Y-m-d H:i:s'), $error['message'], $error['file'], $error['line'], $fullUrl ); error_log($logMessage, 3, '/path/to/your/error.log'); } } register_shutdown_function("handleFatalError");
将上述代码放入项目入口文件(如index.php),即可让所有错误日志包含请求URL。
内容的提问来源于stack exchange,提问作者Matthew A
相关产品推荐
相关产品推荐

