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

时间:2012-05-05 13:25:16

标签: php logging exception-handling error-handling error-logging

我可能只是遇到了错误处理文档的问题,但我想到的是几种不同的场景:

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

  2. 对于webapp /平台(如Wordpress或MediaWiki等),存在Web应用程序错误日志中的PHP错误(全部,而不仅仅是webapp抛出的错误)。 (这几乎肯定是基于严重性的。想法是转到webapp错误日志,并能够看到混合的PHP致命错误,以避免搜索该域的错误日志等)

  3. Web应用程序引发的某些类型的错误也会转到一般错误日志和它自己的自定义日志(我知道我已经看过其中一个,但不是两个)。

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

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

2 个答案:

答案 0 :(得分:4)

您可以设置自己的错误处理程序,并让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
});

答案 1 :(得分:0)

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

    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");