Laravel模型相关日志

时间:2017-07-31 21:01:45

标签: php laravel logging laravel-5 eloquent

我使用laravel开发了一个非常大的Web应用程序。记录到单个文件或每日文件对我来说似乎太乱了。

我的目的是创建错误日志,这些日志将被分类并易于检索,以便在前端显示以获得技术支持。例如。用户输入了错误的api-key,电子邮件等等。

P.S。用户并不总是理解所显示错误的含义,因此他们会联系技术支持。

  

更好理解的示例:

     

假设我有模型关系:User->hasMany->Project和某些模型关系   项目出现异常,我希望它被编写和相关   该项目。等等。所以我可以做$some_project_model->logs()->get()这样的事情,技术支持得到所有相关的日志   某个项目。

我想到的是日志的单独表格,它与某些Eloquent模型有关。但是要做到这一点,ExceptionHandler需要知道与Exception相关的模型。

那么如何实现呢?也许我可以将自定义的ExceptionHandler分配给某个类?

感谢您提出任何建议。

2 个答案:

答案 0 :(得分:1)

所以我实际上找到了一个合适的解决方案:

首先,需要创建具有多态关系的Log表。然后在某些上下文中捕获所有异常__call可以使用魔术方法。 __call方法允许使用自定义代码包装每个对象方法调用。在这种情况下尝试捕获。

示例:

class Loggable
{

    public function __call($method, $arguments)
    {
        try {
            return call_user_func_array([$this->certain_obj, $method], $arguments);
        } catch (Exception $e) {
            //creating new $log orm
            $this->get_orm()->loggable()->save($log);
        }
    }

    protected function do_something() {
        //something is going on
        throw new \Exception();
    }
}

$loggable_obj = new Loggable();
$loggable_obj->do_something();

要使其正常工作,您必须将所有可记录方法设为私有或受保护。

如果您认为'封装'不仅仅是另一个难以理解的单词,您可以使用代理类获得相同的结果。

示例:

class Proxy
{
    private $some_obj;

    public function __construct($some_obj)
    {
        $this->some_obj = $some_obj;
    }

    public function __call($method, $arguments)
    {
        try {
            return call_user_func_array([$this->some_obj, $method], $arguments);
        } catch (Exception $e) {
            //creating new $log orm
            $this->some_obj->get_orm()->loggable()->save($log);
        }
    }
}

$proxy = new Proxy($some_obj);
$proxy->whatever_method($foo, $bar);

因此,在这两种情况下,我都可以通过调用->logs()->get()来获取与某些精确orm相关的所有日志。

根本不是火箭科学。

答案 1 :(得分:0)

一种方法可能是创建自己的自定义异常(子)类,您可以在抛出异常时添加模型和/或项目信息。然后,此信息将在ExceptionHandler中提供。

但是,对于内置或第三方异常类型,您不会拥有它。对于那些你最终必须抓住并重新抛出可能(和必要)的人来说,包装你的自定义异常类,这可能并不理想。