aaronsaray / phproblemlogger
PHP Problem Logger:带有完整运行时信息的异常和错误记录。
Requires
- php: >=5.5.0
- psr/log: ^1.0
Requires (Dev)
- phpunit/phpunit: ^4.8
- satooshi/php-coveralls: ~1.0
This package is auto-updated.
Last update: 2024-09-21 19:50:24 UTC
README
此工具有助于在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 文件