百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>网页制作> PHP 框架中的日志系统
分享文章到:

PHP 框架中的日志系统

发布时间:09/01 来源:未知 浏览: 关键词:

引言

接触过php框架的伴侣们大概都知道,日志在项目中的重要作用了,他可以帮忙我们定位错误的位置,让程序更友好(处置得当的话不会直接抛出一大堆只要程序猿才真正动的英文),调试的时候也会很利便,还可以记载一些重要的操纵等等,总之一个完全的项目如果没了日志系统,就已经开发的路上布满了荆棘、坑洼,必定会磕磕绊绊的。

简介

要把握PHP日志系统,必需先对这几点东西理解透彻。

一、php的几个函数

set_exception_handler(callback $exception_handler); //非常捕捉自定义处置函数注册

set_error_handler(callback $error_handler); //错误捕捉自定义处置函数注册

register_shutdown_function(callback $callback); //程序施行时非常终止错误捕捉处置函数注册

这三个函数在错误处置操纵中给开发者供给了很大的自主空间,在日志系统中记载日志信息有他们的功绩。

在程序中显现非常(exception)问题时,php内核会抛出非常错误,然后将错误信息打印给使用者,假如注册了exception处置函数,php抛出的非常会转给自定义的注册的非常捕捉函数,这个函数里面包括了我们要做的处置,记载错误信息(包罗错误具体内容、错误位置),该函数处置完非常后,非常就会终止。

当程序中显现error时,我们注册的error处置函数会在函数中将错误信息转化为一个错误非常对象传递给非常处置函数,也就是第一步的$exception_handler函数。

当做续重显现shutdown错误时,会施行我们注册的非常终止处置函数,该函数通过error_get_last()猎取到最后的shutdown时的错误对象,接着和上一部一样,生成一个error exception对象,将该对象传递给我们注册的非常处置函数。

可以看到,其实不管是非常还是错误,都是将本人的信息转化为非常处置函数认识的非常信息,然后交给非常处置函数处置,非非常信息就像化了妆的女人一样,非常处置程序不认识这些非非常信息,只要将装卸掉(非非常信息本人转化为非常信息,准确的说应当是抛出),非常处置才认识。

6f25bf4ba7f8efae6844678ae4b6b1a.png

php日志系统中的错误处置流程

那么此刻问题来了,这几个函数一样会配合一个非常处置类库,加上一个错误日志记载类库来停止工作,非常处置类库中包括要注册的3个函数,日志记载类库在$exception_handler中调取,用来合理的记载和放置日志文件的位置,上面说到的几个函数一样是在程序框架入口处停止加载注册的,就像下面这样:

这里面用的是array(class,function)这种方式。

set_exception_handler(array("Myexception","exceptionHandler"));
set_error_handler(array("Myexception","errorHandler"));
register_shutdown_function(array("Myexception","shutdownHandler"));

二、日志记载相关类库

第一部分介绍到的东西只是对非常、错误、shutdown停止了捕捉,这只是第一步,接下来还要对捕捉到的信息停止合理的处置,比方说记载这些日志信息到当地文件系统中(这个操纵是在array(“Myexception”,”exceptionHandler”)),这个地方就用到了日志记载类库。(下面要说的类库是借鉴了kohana日志系统的设计)。

日式日志记载也很简便只要做的将信息增加到文件末尾就行,这个很容易实现,信赖大家都可以本人实现,但是要设计出一个便利的、高效的、扩展的日志记载类库就不那么简便了,要经过长时间的实践总结优化才可以,kohana框架中的日志记载类库已经比力成熟了,因此这里拿来借鉴。

信赖使用过kohana的会员必然对kohana框架中的日志记载比力熟知,不熟知也不妨,我下面会大约的说说,在kohana源码中的application/bootstrap.php文件中的第109——112行可以看到下面的代码:

/**
* Attach the file write to logging. Multiple writers are supported.
*/
Kohana::$log->attach(new Log_File(APPPATH.'logs'));

这个就是增加一个日志记载对象到日志对象中,留意橄榄色打底的俩个,他们是不一样的类库实例,在kohana中,日志记载对象分为两部分,第一部分就是日志对象,用来保护一个日志记载对象的列表,这个要如何懂得呢,其实就像一个容器,里面包括了一个或多个日志记载对象(这个就是第二部分,这些日志记载对象才是真正来记载日志的),还有每个对象要记载的错误等级的数组,当知足错误等级的时候才会去记载,不知足就会略掉。下面是我本人简化重命名后的日志记载方式:

self::$log = Log::instance();
self::$log->attach(new Logwriter("./data/debug"),Log::DEBUG);
self::$log->attach(new Logwriter("./data/notice"),Log::NOTICE);

我这里面为了更好地懂得,将“容器”命名为Log,记载的实例命名为Logwriter,可以看到我在程序入口处很容易的增加了两不一样的日志品种,第一个是记载所有错误号比Log::DEBUG小的错误(错误级别比他高),并按规则记载在文件夹./data/debug下面;

第二个是记载级别等于或高于Log::NOTICE的错误,当然了你还可以更具体拟定详细哪些错误好,传递数组就行了,这个就是我感受利便、快速的地方,我们可以按照需求来增加错误日志、分不一样的日志名目,下面看一幅图或许会有助于懂得:

44e22ad37e8bd619ab34d7a5bab4e7b.png

log与logwriter的关系

通过上面的图你就会看到Log是一个容器,包括了详细的不一样的logwriter对象,每个对象大概要记载不一样的信息,当错误信息要刷到文件中的时候,会运转每一个Logwriter实例,看看本人可否要记载errormessage中的错误,errormessage中的level不包括在Logwriter内时忽略。

这本分和第一部分如何合作的呢?其实很简便,当exception捕捉的非常时会调取增加一条错误信息(包罗错误位置、错误代号、错误信息等信息)到Log容器中的errormessage数组中,然后当程序完毕之后在将这些信息写入文件;

这里还要留意下,或许你在阅读kohana代码是发明没有明显的直接写入到日志中去,这里面kohana优化的比力好,由于php的一次施行大概显现多个错误,假如来一个错误你就去记载一次这样会在程序返回此前占用余外的io和时间;

所以kohana的做法是默许将所有的错误、非常、日志存置在Log::$errormessage中,并在实例化的时候讲Log中的writer操纵注册register_shutdown_function,这个函数的作用是在程序非常终止或者施行完成之后施行,前面第一部分也有使用到,这样日志记载就不会对本次php的施行发生带大的影响。

更多PHP相关知识,请拜访PHP教程!

以上就是PHP 框架中的日志系统的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有150人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板