资讯专栏INFORMATION COLUMN

CI 配合 register_shutdown_function 统一上报错误日志

mtunique / 3158人阅读

摘要:于是查到有一个钩子的功能最终有钩子能满足需求在系统执行的早期调用,这个时候只有基准测试类和钩子类被加载了,还没有执行到路由或其他的流程。

最近线上项目最近偶尔报500错误,虽然根据日志可以拿到引发错误的请求参数,但是还是要自己去模拟请求,更甚着,由于等到自己去模拟请求的时候,引发错误的主体(比如,同样的订单,同样的请求参数,订单状态为3时会报错,但是当你去模拟的时候,订单状态已经变为4了,此时又不会报错了)的状态已经发生变化,因此需要保存发生错误时候的上下文。
于是查到CI有一个钩子的功能

最终有pre_system钩子能满足需求:

pre_system 在系统执行的早期调用,这个时候只有 基准测试类 和 钩子类 被加载了, 还没有执行到路由或其他的流程。

具体使用方法如下:
在对应项目的hooks.php里添加

$hook["pre_system"][] = array(
    "class" => "ErrorCatch",
    "function" => "errorCatchInit",
    "filename" => "ErrorCatch.php",
    "filepath" => "controllers/app", //这里不要加APPPATH
);

然后新建对应的类

最终错误处理类如下:

class ErrorCatch {
    public function errorCatchInit() {
        register_shutdown_function([$this, "handleShutdown"]);
    }

    public static function handleShutdown() {
    //write_log();
}
}

但此时还不能捕获错误日志,因为CI本身自己实现了一套register_shutdown_function,在core/Common.php_error_handler方法里,有如下代码

$is_error = (((E_ERROR | E_PARSE | E_COMPILE_ERROR | E_CORE_ERROR | E_USER_ERROR) & $severity) === $severity);

·
·
·

if ($is_error)
{
  exit; //直接就脚本退出了
}

有多个register_shutdown_function callback时,当前面的exit后,就不会触发后面的callback了, 于是:

在index.php里添加
define("SELF_ERROR_SHUT_DOWN", 1);

然后
if ($is_error)
{
  exit; //直接就脚本退出了
}

改为

if ($is_error)
{
  if (defined("SELF_ERROR_SHUT_DOWN")) {
                return;
    }
  exit;
}

至此,就可以统一收集程序错误,并且上报了

原文

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/26115.html

相关文章

  • Laravel核心解读--异常处理

    摘要:请求未通过的验证时会抛出此异常。异常处理是非常重要但又容易让开发者忽略的功能,这篇文章简单解释了内部异常处理的机制以及扩展异常处理的方式方法。 异常处理是编程中十分重要但也最容易被人忽视的语言特性,它为开发者提供了处理程序运行时错误的机制,对于程序设计来说正确的异常处理能够防止泄露程序自身细节给用户,给开发者提供完整的错误回溯堆栈,同时也能提高程序的健壮性。 这篇文章我们来简单梳理一下...

    includecmath 评论0 收藏0
  • PHP框架中的日志系统

    摘要:一的几个函数异常捕获自定义处理函数注册错误捕获自定义处理函数注册程序执行时异常终止错误捕获处理函数注册这三个函数在错误处理控制中给开发者提供了很大的自主空间,在日志系统中记录日志信息有他们的功劳。下面要说的类库是借鉴了日志系统的设计。 引言 接触过php框架的朋友们可能都知道,日志在项目中的重要作用了,他可以帮助我们定位错误的位置,让程序更友好(处理得当的话不会直接抛出一大堆只有程...

    ningwang 评论0 收藏0
  • 前端性能与异常上报

    摘要:回过头来发现,我们的项目,虽然在服务端层面做好了日志和性能统计,但在前端对异常的监控和性能的统计。对于前端的性能与异常上报的可行性探索是有必要的。这是我们页面加载性能优化需求中主要上报的相关信息。 概述 对于后台开发来说,记录日志是一种非常常见的开发习惯,通常我们会使用try...catch代码块来主动捕获错误、对于每次接口调用,也会记录下每次接口调用的时间消耗,以便我们监控服务器接口...

    gggggggbong 评论0 收藏0

发表评论

0条评论

mtunique

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<