>  기사  >  백엔드 개발  >  PHP 프레임워크의 로깅 시스템

PHP 프레임워크의 로깅 시스템

藏色散人
藏色散人앞으로
2019-09-28 14:02:385097검색

PHP 프레임워크의 로깅 시스템

소개

PHP 프레임워크에 노출된 친구는 프로젝트에서 로그의 중요한 역할을 알 수 있으며 오류 위치를 찾고 프로그램을 보다 친숙하게 만드는 데 도움이 될 수 있습니다(제대로 처리된다면). , 프로그래머만이 실제로 사용할 수 있는 많은 영어를 직접 버리지 않을 것입니다.) 디버깅할 때 매우 편리할 것이며 일부 중요한 작업 등을 기록할 수도 있습니다. 간단히 말해서, 전체 프로젝트에 로그가 없는 경우 시스템은 이미 개발 단계에 있어서 가시와 움푹 들어간 부분이 많아 걸림돌이 될 수밖에 없습니다.

소개

PHP 로깅 시스템을 마스터하려면 먼저 이러한 사항을 철저히 이해해야 합니다.

1. PHP의 여러 기능

set_Exception_handler(callback $Exception_handler); //사용자 정의 핸들러 함수 등록 예외 캡처

set_error_handler(callback $error_handler); //사용자 정의 핸들러 함수 등록 오류 캡처

register_shutdown_function($ callback); //프로그램 실행 중 오류 캡처 처리 기능 등록이 비정상적으로 종료됨

이 세 가지 기능은 개발자에게 오류 처리 제어에 많은 자율성을 제공하며 로그 시스템 크레딧에 로그 정보를 기록하기 위한 자체 요구 사항이 있습니다.

프로그램에서 예외가 발생하면 PHP 커널은 예외 오류를 발생시킨 다음 사용자에게 오류 메시지를 인쇄합니다. 예외 처리 기능이 등록되면 PHP에서 발생한 예외는 사용자 정의 등록된 기능으로 전송됩니다. 예외 포착 기능은 우리가 수행해야 하는 처리를 포함하고 오류 정보(오류 세부 정보 및 오류 위치 포함)를 기록합니다. 이 기능이 예외를 처리한 후 예외가 종료됩니다.

프로그램에서 오류가 발생하면 우리가 등록한 오류 처리 함수는 오류 정보를 함수 내 오류 예외 개체로 변환하고 첫 번째 단계의 $Exception_handler 함수인 예외 처리 함수에 전달합니다.

재개 중 종료 오류가 발생하면 우리가 등록한 비정상 종료 처리 함수가 실행됩니다. 이 함수는 마지막 종료 시 error_get_last()를 통해 오류 객체를 얻은 후 이전 부분과 마찬가지로 오류 예외 객체를 생성합니다. 이 객체는 등록된 예외 처리기 함수에 전달됩니다.

실제로는 예외인지 오류인지 자신의 정보를 예외 처리 함수에서 인식한 예외 정보로 변환한 다음 예외 처리 함수에 전달하여 비예외 정보를 처리하는 것을 볼 수 있습니다. 처리기는 이러한 비예외 정보를 로드 및 언로드할 때만 인식하지 못합니다(비예외 정보 자체는 예외 정보로 변환되므로 정확하게 던져야 함). 핸들러는 그것을 인식합니다.

PHP 프레임워크의 로깅 시스템

PHP 로그 시스템의 오류 처리 프로세스

이제 질문이 나옵니다. 이 함수는 일반적으로 예외 처리 라이브러리 및 오류 로깅 라이브러리와 함께 작동합니다. 로그 파일을 합리적으로 기록하고 배치하기 위해 $Exception_handler에서 로깅 클래스 라이브러리가 호출됩니다. 위에서 언급한 함수는 일반적으로 프로그램 프레임워크 입구에서 로드되어 등록됩니다.

배열(클래스, 함수) 메서드가 사용됩니다. 여기.

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

2. 로깅 관련 클래스 라이브러리

첫 번째 부분에서 소개한 내용은 예외, 오류 및 종료만 캡처합니다. 다음으로 캡처된 정보를 합리적으로 처리해야 합니다. 이러한 로그 정보를 로컬 파일 시스템에 기록합니다(이 작업은 array("MyException", "ExceptionHandler")에 있음). 여기서 로깅 클래스 라이브러리가 사용됩니다. (아래에 언급된 클래스 라이브러리는 kohana 로그 시스템의 설계를 기반으로 합니다.)

일본식 로깅도 매우 간단합니다. 파일 끝에 정보를 추가하기만 하면 누구나 쉽게 구현할 수 있지만 편리한 디자인이 필요합니다. , 효율적이고 확장된 로깅 라이브러리. 더 이상 간단하지 않습니다. 오랜 연습 후에 요약하고 최적화해야 합니다. kohana 프레임워크의 로깅 라이브러리는 상대적으로 성숙하므로 여기서 참조할 수 있습니다.

kohana를 사용해본 사용자라면 반드시 kohana 프레임워크의 로그인에 대해 잘 알고 있을 것이라 생각합니다. 익숙하지 않아도 상관없습니다. 아래에서 109-112번에 대해 간략하게 설명하겠습니다. kohana 소스 코드의 application/bootstrap.php 파일에서 다음 코드를 볼 수 있습니다.

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

이는 로그 객체에 로깅 객체를 추가하는 것입니다. 둘은 올리브색입니다. 클래스 라이브러리 인스턴스 코하나에서 로깅 개체는 두 부분으로 나뉘며, 첫 번째 부분은 로깅 개체 목록을 유지하는 데 사용되는 로그 개체입니다. 실제로 이를 이해하는 방법은 무엇입니까? 이상의 로깅 개체(이것은 두 번째 부분입니다. 이러한 로그 기록 개체는 실제로 로그를 기록하는 개체입니다.) 각 개체에 대해 기록할 오류 수준의 배열도 있습니다. 그렇지 않은 경우에는 무시됩니다. 이름을 바꾼 후 나만의 단순화된 로깅 방법은 다음과 같습니다.

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的错误,当然了你还可以更详细制定具体哪些错误好,传递数组就行了,这个就是我感觉方便、快捷的地方,我们可以根据需求来添加错误日志、分不同的日志目录,下面看一幅图也许会有助于理解:

PHP 프레임워크의 로깅 시스템

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 프레임워크의 로깅 시스템의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제