# PHPlog **Repository Path**: hongxin01/PHPlog ## Basic Information - **Project Name**: PHPlog - **Description**: 短小的日志记录类 - **Primary Language**: PHP - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2016-11-04 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #PHPlog ## first 首先认识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对象,将该对象传递给我们注册的异常处理函数。 这里面用的是array(class,function)这种方式。 * set_exception_handler(array("Myexception","exceptionHandler")); * set_error_handler(array("Myexception","errorHandler")); * register_shutdown_function(array("Myexception","shutdownHandler")); ## second 其次,认识其中的设计思想。 在kohana源码中的application/bootstrap.php文件中的第109——112行可以看到下面的代码: 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的错误,当然了你还可以更详细制定具体哪些错误好,传递数组就行了,可以根据需求来添加错误日志、分不同的日志目录: ![输入图片说明](https://git.oschina.net/uploads/images/2017/0811/195627_8e7c74c0_438639.png "131339247129473.png") Log是一个容器,包含了具体的不同的logwriter对象,每个对象可能要记录不同的信息,当错误信息要刷到文件中的时候,会运行每一个Logwriter实例,看看自己是否要记录errormessage中的错误,errormessage中的level不包含在Logwriter内时忽略。 当exception捕获的异常时会调用添加一条错误信息(包括错误位置、错误代号、错误信息等信息)到Log容器中的errormessage数组中,然后当程序结束之后在将这些信息写入文件,这里还要注意下,也许你在阅读kohana代码是发现没有明显的直接写入到日志中去,这里面kohana优化的比较好,因为php的 的一次执行可能出现多个错误,如果来一个错误你就去记录一次这样会在程序返回之前占用多余的io和时间,所以kohana的做法是默认将所有的错误、异常、日志存放在Log::$errormessage中,并在实例化的时候讲Log中的writer操作注册register_shutdown_function,这个函数的作用是在程序异常终止或者执行完成之后执行,前面第一部分也有使用到,这样日志记录就不会对本次php的执行产生带大的影响。 ## Third 可以看testlog.php中的案例