You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 11:27:13