aaronsaray/phproblemlogger

PHP Problem Logger:带有完整运行时信息的异常和错误记录。

1.1.2 2016-07-18 13:21 UTC

This package is auto-updated.

Last update: 2024-09-21 19:50:24 UTC


README

Build Status Coverage Status

此工具有助于在PHP发生问题(如异常或错误)时创建更好的当前环境日志。异常由异常处理器处理,错误被转换为自定义的ErrorException并抛出。

安装说明

使用以下命令安装最新版本

$ composer require aaronsaray/phproblemlogger

文档

入门

此库将使用PSR-3兼容的日志实例添加到现有的未捕获异常和错误处理器,以输出当前环境。此日志器的配置是可添加的,这意味着在问题发生时默认不记录任何内容。您必须配置过滤器来指示您想要记录的内容。

所有未捕获的异常都使用此库进行处理。错误类型为E_ALL | E_STRICT被转换为自定义异常并处理。

要使用此工具,您需要有一个PSR-3日志器的实例和至少一个可调用的过滤器。

重要 如果您已经设置了自己的异常处理(如重定向或漂亮的视图),请在定义您的处理器之后创建PHProblemLogger的新实例。PHProblemLogger会保留对上一个处理器的引用,并在处理完成后调用它。这不适用于错误处理器。错误处理器被覆盖,错误被转换为ErrorException

示例

在此示例中,我们希望在发生异常时将$_SERVER$_COOKIE变量记录到我们的日志文件中。

use AaronSaray\PHProblemLogger\Handler as Handler;
use AaronSaray\PHProblemLogger\Handler as HandlerFilter;

$monolog = $monolog; // this is an instance of a PSR-3 logger interface

$problemHandler = new Handler($monolog);
$problemHandler
    ->server(function(array $payload) {
        return $payload;
    })
    ->cookie(HandlerFilter::all());

要创建问题处理程序的新实例,创建类的实例,并将LoggerInterface类作为构造函数的第一个参数传递。这将自动将PHPProblemHandler添加到您的应用程序中错误和异常处理程序堆栈。然后,对于我们想要记录的每个运行时环境部分,我们向它传递一个可调用的函数。

首先,为了获取所有$_SERVER变量,我们调用->server()并传递一个闭包,该闭包接受一个包含$_SERVER变量的负载。在这种情况下,我们只是返回整个数组。

接下来,当过滤$_COOKIE超级全局变量时,我们调用处理器的all()辅助函数。
这本质上返回一个与我们所编写的闭包相同的函数。它只是用来节省时间。

现在,任何异常或错误都会将$_SERVER$_COOKIE变量的全部内容写入到日志器。
请记住,因为我们没有添加其他过滤器,所以像$_GET$_POST这样的项不会记录。

过滤器函数

过滤器函数需要传递一个PHP Callable作为其唯一的参数。此Callable将接收一个包含负载变量的数组。返回类型应该是数组或null。NULL表示这部分不应该记录。您可以选择返回未修改的整个数组,修改它,或完全替换它(不推荐)。

您可能需要在涉及安全值的情况(如$_POST中的信用卡号码或$_ENV中的数据库连接变量)下更改值。

Handler::session - 访问 $_SESSION

Handler::get - 访问 $_GET

Handler::post - 访问 $_POST

Handler::cookie - 访问 $_COOKIE

Handler::environment - 访问 $_ENV

Handler::server - 访问 $_SERVER

Handler::application - 空数组,用于添加自定义应用值

内置的过滤器调用

为了节省时间,有两个辅助方法可以返回过滤器调用。

HandlerFilter::all - 返回一个过滤器,返回未更改的整个有效负载

HandlerFilter::none - 返回一个过滤器,返回 null,确保变量不会被记录

食谱

对于以下食谱,我们假设 $handler 变量是这个库的一个实例,并且已经注入了有效的记录器。

只有在从网络服务器运行时才记录 $_SERVER

$handler->server(function(array $payload) {
  return php_sapi_name() != 'cli' ? $payload : null;
});

通过 'cc_num' 键在 $_POST 中屏蔽信用卡号

$handler->post(function(array $payload) {
  if (array_key_exists('cc_num', $payload)) {
    $payload['cc_num'] = str_pad(substr($payload['cc_num'], -4), strlen($payload['cc_num']), '*', STR_PAD_LEFT);
  }
  return $payload;
});

根据应用选择有条件地不记录 $_SESSION

use AaronSaray\PHProblemLogger\Handler as HandlerFilter;

$handler->session(HandlerFilter::all());

if (someFunctionIsTrue()) {
  $handler->session(HandlerFilter::none());
}

无需复杂的应用程序/DI 解决方案即可从会话中记录用户信息

$handler->application(function(array $payload) {
  if (isset($_SESSION['user'])) {
    $payload['user'] = $_SESSION['user'];
  }
  return $payload;
});

使用依赖注入在应用程序中记录详细用户信息

class MyUserErrorFilter
{
  protected $authenticationProvider;
  
  public function __construct($authenticationProvider)
  { 
    $this->authenticationProvider = $authenticationProvider;
  }
  
  public function __invoke(array $payload)
  {
    if ($this->authenticationProvider->isLoggedIn()) {
       $payload['authenticationInfo'] = $this->authenticationProvider->getAuthenticationInfo();
    }
    return $payload;
  }
}

$handler->application(new MyUserErrorFilter($yourAuthenticationProviderInstance));

添加其他有用的信息,如内存使用情况

$handler->application(function(array $payload) {
  $payload['memory_usage'] = memory_get_usage();
  $payload['pid'] = getmypid();
  $payload['resource_usage'] = getrusage(); 
  return $payload;
});

即使在捕获到异常的情况下也使用 PHProblemLogger 异常记录工具

请注意:如果您在 PHProblemLogger 之前定义了自定义异常处理器,这将启动您的处理器。

try {
  somethingCausesException();
}
catch (\Exception $e) {
  // some custom programming here
  $handler->handleException($e);
}

故障排除

会话变量没有被记录。
请确保在发生错误之前,您在某处调用了 session_start()。这个库不会尝试只为了报告会话内容而启动一个会话。

我的自定义异常处理器没有触发
确保在定义自定义异常处理器后,您创建了 Handler 的新实例。如果您正在使用任何其他类型的异常处理器排队系统,这可能不起作用。

我没有在输出中看到任何来自 PHProblemLogger 的日志
这可能是由多种原因造成的。首先,请注意,正在使用 ERROR 级别来记录异常和错误。请验证您的日志写入器是否配置了该日志级别。其次,您可能想要验证 PHProblemHandler 的异常处理器没有被移除。当您调用 set_exception_handler 时,它返回之前的异常处理器。使用调试器验证异常处理器是否仍然设置。一个快速的解决方案是使用以下代码来验证这一点:var_dump(set_exception_handler(function(){})); - 应返回一个可调用函数,反映 Handler::handleException 函数的 PHProblemHandler。

待办事项

  • TravisCI 7.x 和 HHVM
    目前,这失败是因为独立的进程测试没有找到代码覆盖率文件和/或 PharException。

关于

目前有很多系统可以处理错误显示 - 以及一些更复杂的解决方案(如 Zend Server),用于在错误情况下收集整个环境。然而,在这些之间并没有真正的东西 - 某些可以记录错误和运行时环境 - 而不依赖于更大的、企业级解决方案或第三方。

我遇到了一些奇怪的错误,我真的很需要更多地了解环境来解决问题,所以我决定在我的应用程序中添加这样的东西。然后我将其创建为一个开源项目 - 希望这能帮到你!

需求

  • PHP 5.5+

错误和功能请求

错误和功能请求在 GitHub 上跟踪

在项目的根目录中执行 composer tests 来运行测试。

作者

Aaron Saray - http://aaronsaray.com

许可证

这个库根据 MIT 许可证授权 - 有关详细信息,请参阅 LICENSE 文件