将 PHP 错误发送到默认错误日志以及用户定义的错误日志


Send PHP errors to default error log plus user-defined error log

我可能只是在错误处理文档方面遇到问题,但我想到的是几种不同的情况:

  1. 当 PHP 抛出一个典型的错误时,我想保留我放置的默认错误日志记录,但也根据错误类型/严重性有单独的错误日志(仅针对致命错误的日志,所以我不必扫描过去数百万个小错误,但仍然将这些小错误记录在一般堆中(。

  2. 对于Web应用程序/平台(如Wordpress或MediaWiki等(,将PHP错误(所有,而不仅仅是Webapp引发的错误(存储在Web应用程序错误日志中。(这几乎可以肯定是基于严重性的。 这个想法是转到webapp错误日志,并能够看到PHP致命错误混合在一起,以避免查找该域的错误日志等(

  3. Web应用程序抛出的某些类型的错误也会转到常规错误日志,它是自己的自定义日志(我知道我已经看到了一个或另一个,但不是两个(。

所以根本问题是:如何在不丢失/覆盖默认错误日志的情况下拥有自定义错误日志?

此外,假设在大多数情况下,此级别的错误和异常是可以互换的,或者我是否需要采取其他步骤来实现类似的异常处理目标,这是否非常安全?

您可以设置自己的错误处理程序,并且仍然让 php 像往常一样处理触发的错误

http://se.php.net/manual/en/function.set-error-handler.php

set_error_handler(function($errno, $errstr, $errfile, $errline) {
  // do what you want  
  return false; // returning false makes PHP execute its own error handler as well
});

您可以使用自定义错误处理程序并将消息记录到不同的文件中,例如,

    function myErrorHandler($errno, $errstr, $errfile, $errline)
    {
        if (!(error_reporting() & $errno)) {
            return false;
        }
        $logFile = "";
        switch ($errno) {
        case E_USER_ERROR:
            $logFile = "logs/php-errors-".date("yyyy-mm-dd",time());
            exit(1);
            break;
        case E_USER_WARNING:
        $logFile = "logs/php-warnings-".date("yyyy-mm-dd",time());
            break;
        case E_USER_NOTICE:
        $logFile = "logs/php-notices-".date("yyyy-mm-dd",time());
            break;
        default:
        $logFile = "logs/php-unkown-".date("yyyy-mm-dd",time());
            break;
        }
      error_log($errstr,3,$logFile);
        return true;
    }

您应该使用

    set_error_handler("myErrorHandler");