如何在不使用任何框架的情况下在PHP Web服务上记录请求和错误

时间:2017-06-30 06:35:57

标签: php error-logging

  1. 我正在为Web应用程序开发PHP后端API服务器, 其中包含50多个PHP API。
  2. 现在我需要的是我 需要记录所有请求,并且这些API会发生错误。
  3. 我没有使用任何框架。
  4. 我已经创建了自己的日志代码 请求如下所示。
  5. // ************** PHP API请求日志代码*****************

    函数log_data     {

    $req_dump = json_encode($_REQUEST);
    
    $actual_link = (isset($_SERVER['HTTPS']) ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
    
    $filename = str_replace(" ", "_", $_FILES['userfile']['name']);
    
    
    $log  = "------------------------------------------------------------".PHP_EOL.
    "UserIP: ".$_SERVER['REMOTE_ADDR'].' - '.date("F j, Y, g:i a").PHP_EOL.
           "Request Data: ".$req_dump.PHP_EOL.
           "Request Method: ".$_SERVER['REQUEST_METHOD'].PHP_EOL.
           "API URL: ".$actual_link.PHP_EOL.
           "File Name: ".$filename.PHP_EOL.
           "------------------------------------------------------------".PHP_EOL;
    }
    
    
           // $fp = fopen('../api_logs/request.txt', 'a');
           // $fw = fwrite($fp, $log);
           // fclose($fp);
           $fp = file_put_contents( '../api_logs/request.log', $log, FILE_APPEND);
    
    // **************PHP API Request Log Code*****************
    
    1. 现在将所有API的请求信息和错误日志一起记录到服务器本身的文件中的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

没有任何框架,您可以使用error handling的默认php函数:

  • set_error_handler(),用于通知,警告,弃用等,具体取决于您的错误报告级别。
  • register_shutdown_function()表示致命错误
  • 异常的set_exception_handler()

然后,您可以将这些信息存储在文本文件或数据库中。

set_error_handler的示例:

set_error_handler(function ($errno, $errstr, $errfile, $errline) {
    // do your custom error handling        
});

register_shutdown_handler示例:

register_shutdown_function(function () {
    $error = error_get_last();
    // $error should be array containing 'message', 'file', 'line' etc...
});

答案 1 :(得分:1)

您可以设置PHP error handlers来捕获错误和警告,如BenRoob的回复中所述。但请注意,您的代码易受攻击:

  • 要记录毒药:攻击者可能会在您的日志中注入代码,以便将其与其他类型的漏洞(例如LFI)一起使用。
  • And Log injection

要修复第一个,您可以使运行PHP的用户无法访问日志文件(例如,仅为其提供写访问权限) 对于第二个,只需从用户输入中转义所有PHP_EOL。