error_log与包含文件在同一目录中?

时间:2013-09-10 05:41:27

标签: php include prepend error-log

我研究了不同的方法和指令,包括:

  • 的auto_prepend_file
  • .user.ini文件
  • GETCWD()
  • debug_backtrace()

我似乎无法找到一种方法来更改error_log的路径,以便在与包含/需要的文件相同的路径中登录。

例如,假设index.php有一行:

include('subdir/file.php');

如果subdir/file.php有语法错误,强制php创建subdir/error_log,而不是在与index.php相同的路径中创建error_log的默认行为,则auto_prepend_file会受到同样的限制。它会在调用第一个脚本之前预先指定文件,而不是包含每个文件。

我环顾四周,似乎无法找到合法的方法来做到这一点。我通过这样做了解性能开销的影响,并计划仅将其用于开发目的。我相信这可以帮助隔离错误,而不是使用debug_backtrace()之类的堆栈跟踪,因为我可以使用终端脚本显示上次修改的最后错误日志,并且比读取大量错误更快地找到有问题的文件登录。

我的目标是最终不要显示这些文件,显然,调试现有网站并且必须经历10GB错误日志或tail / multitail它可能有些麻烦。我正在尝试设计这种方法,因此可以通过路径隔离错误。有什么建议?

1 个答案:

答案 0 :(得分:2)

基于hakre的上述建议,我创建了这个脚本,包含在任何php脚本的顶部:

(如果你想分叉/下载它,这里还有我对这个文件的要点:view on github

<?
function custom_error_debug($errno, $errstr, $errfile, $errline, $errvars) {
  $message = "";
  $message .= "[ " . date('Y-m-d h-i-s') . " ] Error: [$errno] $errstr on line $errline of $errfile ";

  //Dump all info to browser!
  //WARNING: Leave this commented except for extreme cases where you need to see all variables in use!
  //Using this will cause excessive processing time, and RAM. Use only as needed!
  /*if (!empty($errvars)) {
     echo $message . PHP_EOL . "Variables in use: <pre>";print_r($errvars); echo "</pre>";
     //WARNING: not ending execution here may cause the browser to overload on larger frameworks, comment out at your own risk!
     die();
  }*/

  //get the directory of the offending file, put a log in that path, and separate them by end of line, append to file
  file_put_contents ( dirname($errfile) . "/php_errors.log", $message . PHP_EOL, FILE_APPEND );

  //Dump all variables to file as well, (MAY CAUSE LARGE FILES, read above)
  //file_put_contents ( dirname($errfile) . "/php_errors.log", $errvars . PHP_EOL, FILE_APPEND );

  //Optionally end script execution
  //die();
}
set_error_handler('custom_error_debug');
?>