【问题标题】:Send PHP errors to default error log plus user-defined error log将 PHP 错误发送到默认错误日志和用户定义的错误日志
【发布时间】:2012-05-14 19:02:48
【问题描述】:

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

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

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

  3. 此外,如果 webapp 抛出某些类型的错误,请转到常规错误日志和它自己的自定义日志(我知道我已经看到了其中一个,但不是两者都看到了)。

    李>

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

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

【问题讨论】:

  • 我会说:问问你的系统管理员,他应该能够在几分钟内在 perl/linux 中编写一些脚本来完成你告诉她/他做的事情。因为默认情况下,PHP 不具备您正在寻找的功能。所以你需要添加它。
  • @hakre - 目标之一是可移植性,网络应用程序写入它自己的加上默认值。您的建议的另一个限制(一点也不坏)是我比我的系统管理员知道的更多,但没有他们的访问权限,所以这是为了降低对他们的依赖。
  • 您可以为每个应用程序编写自己的错误处理程序,标准日志记录仍然有效,但您也可以编写自己的日志。甚至可能适用于致命错误(但我不确定那个)。
  • @hakre - 所以写我自己的不会禁用默认值?我想这就是我的问题真正归结为的原因。那以及如何将错误/异常从我的应用程序发送到默认 + 自定义。

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


【解决方案1】:

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

【讨论】:

  • return false 是诀窍。我从来没有猜到。我将阅读有关异常处理的内容,看看是否需要有关这些的更多信息。谢谢!
  • 谢谢,我一直在运行自己的错误处理程序代码,因此我可以通过电子邮件向自己发送一些错误,例如支付网关调用失败或返回 404,但这样做会阻止系统日志被填写太 - 这给了我两全其美。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-05
    • 2021-03-26
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    相关资源
    最近更新 更多