백엔드 개발 PHP 튜토리얼 PHP Yii Framework_php 기술의 로깅 기능에 대한 포괄적인 해석

PHP Yii Framework_php 기술의 로깅 기능에 대한 포괄적인 해석

May 16, 2016 pm 07:56 PM
php yii 통나무

Yii 페이지 수준 로깅이 활성화되었습니다
Main.php에 로그 섹션을 추가하세요.
페이지 로그 배열은 아래에 표시됩니다( 'class'=>'CWebLogRoute', 'levels'=>'trace', //레벨은 추적 'categories'=>'system.db.*' //만 데이터베이스에 대한 정보 표시 데이터베이스 연결, 데이터베이스 실행문 등 정보),
전체 목록은 다음과 같습니다.

'log'=>array(
    'class'=>'CLogRouter',
    'routes'=>array(
      array(
        'class'=>'CFileLogRoute',
        'levels'=>'error, warning',

      ),
              // 下面显示页面日志 
              array( 
               'class'=>'CWebLogRoute', 
               'levels'=>'trace',  //级别为trace 
               'categories'=>'system.db.*' //只显示关于数据库信息,包括数据库连接,数据库执行语句 
              ), 
      // uncomment the following to show log messages on web pages
      /*
      array(
        'class'=>'CWebLogRoute',
      ),
      */
    ),
  ),

로그인 후 복사


Yii2와 함께 제공되는 로그 구성 요소 확장

 <&#63;php

/**
 * author   : forecho <caizhenghai@gmail.com>
 * createTime : 2015/12/22 18:13
 * description:
 */
namespace common\components;

use Yii;
use yii\helpers\FileHelper;

class FileTarget extends \yii\log\FileTarget
{
  /**
   * @var bool 是否启用日志前缀 (@app/runtime/logs/error/20151223_app.log)
   */
  public $enableDatePrefix = false;

  /**
   * @var bool 启用日志等级目录
   */
  public $enableCategoryDir = false;

  private $_logFilePath = '';

  public function init()
  {
    if ($this->logFile === null) {
      $this->logFile = Yii::$app->getRuntimePath() . '/logs/app.log';
    } else {
      $this->logFile = Yii::getAlias($this->logFile);
    }
    $this->_logFilePath = dirname($this->logFile);

    // 启用日志前缀
    if ($this->enableDatePrefix) {
      $filename = basename($this->logFile);
      $this->logFile = $this->_logFilePath . '/' . date('Ymd') . '_' . $filename;
    }

    if (!is_dir($this->_logFilePath)) {
      FileHelper::createDirectory($this->_logFilePath, $this->dirMode, true);
    }

    if ($this->maxLogFiles < 1) {
      $this->maxLogFiles = 1;
    }
    if ($this->maxFileSize < 1) {
      $this->maxFileSize = 1;
    }

  }
}

로그인 후 복사

구성 파일에서 다음과 같이 사용하세요.

'components' => [
  'log' => [
    'traceLevel' => YII_DEBUG &#63; 3 : 0,
    'targets' => [
      /**
       * 错误级别日志:当某些需要立马解决的致命问题发生的时候,调用此方法记录相关信息。
       * 使用方法:Yii::error()
       */
      [
        'class' => 'common\components\FileTarget',
        // 日志等级
        'levels' => ['error'],
        // 被收集记录的额外数据
        'logVars' => ['_GET', '_POST', '_FILES', '_COOKIE', '_SESSION','_SERVER'],
        // 指定日志保存的文件名
        'logFile' => '@app/runtime/logs/error/app.log',
        // 是否开启日志 (@app/runtime/logs/error/20151223_app.log)
        'enableDatePrefix' => true,
        'maxFileSize' => 1024 * 1,
        'maxLogFiles' => 100,
      ],
      /**
       * 警告级别日志:当某些期望之外的事情发生的时候,使用该方法。
       * 使用方法:Yii::warning()
       */
      [
        'class' => 'common\components\FileTarget',
        // 日志等级
        'levels' => ['warning'],
        // 被收集记录的额外数据
        'logVars' => ['_GET', '_POST', '_FILES', '_COOKIE', '_SESSION','_SERVER'],
        // 指定日志保存的文件名
        'logFile' => '@app/runtime/logs/warning/app.log',
        // 是否开启日志 (@app/runtime/logs/warning/20151223_app.log)
        'enableDatePrefix' => true,
        'maxFileSize' => 1024 * 1,
        'maxLogFiles' => 100,
      ],
      /**
       * info 级别日志:在某些位置记录一些比较有用的信息的时候使用。
       * 使用方法:Yii::info()
       */
      [
        'class' => 'common\components\FileTarget',
        // 日志等级
        'levels' => ['info'],
        // 被收集记录的额外数据
        'logVars' => ['_GET', '_POST', '_FILES', '_COOKIE', '_SESSION','_SERVER'],
        // 指定日志保存的文件名
        'logFile' => '@app/runtime/logs/info/app.log',
        // 是否开启日志 (@app/runtime/logs/info/20151223_app.log)
        'enableDatePrefix' => true,
        'maxFileSize' => 1024 * 1,
        'maxLogFiles' => 100,
      ],
      /**
       * trace 级别日志:记录关于某段代码运行的相关消息。主要是用于开发环境。
       * 使用方法:Yii::trace()
       */
      [
        'class' => 'common\components\FileTarget',
        // 日志等级
        'levels' => ['trace'],
        // 被收集记录的额外数据
        'logVars' => ['_GET', '_POST', '_FILES', '_COOKIE', '_SESSION','_SERVER'],
        // 指定日志保存的文件名
        'logFile' => '@app/runtime/logs/trace/app.log',
        // 是否开启日志 (@app/runtime/logs/trace/20151223_app.log)
        'enableDatePrefix' => true,
        'maxFileSize' => 1024 * 1,
        'maxLogFiles' => 100,
      ],
    ],
  ],
],

로그인 후 복사

yii 로그의 논리
Yii는 계층적 로그 처리 메커니즘을 사용합니다. 즉, 로그 수집이 로그의 최종 처리(예: 표시, 파일 저장, 데이터 저장)와 분리됩니다.
로그 정보의 수집은 CLogger(로그 기록기)에 의해 완료되며, 로그 정보의 배포 및 처리는 CLogRouter(로그 라우팅 관리자라고 함)의 스케줄링에 따라 처리 개체(CFileLogRoute 및 CLogRoute에서 상속된 로깅 디렉터리 등)에 배포됩니다. 클래스(로그 프로세서라고 함) 소스 코드를 반복해서 읽은 후에는 Yii의 이러한 계층화된 처리 방식을 통해 유연하게 확장할 수 있다는 점에 더욱 깊은 인상을 받았습니다.
로그 정보는 일반 정보, 프로필, 추적, 경고, 오류 수준 등의 수준으로 구분되며, CFileRoute의 수준 속성을 특정 수준의 로그 정보만 처리하도록 설정하는 등 로그 라우팅에서 필터링 조건을 설정할 수 있습니다.
프로그램에서 호출된 경우:

Yii::log($message,CLogger::LEVEL_ERROR,$category);
로그인 후 복사

해당 프로세스는 다음과 같습니다.

  • CLogger 인스턴스 생성
  • YII_DEBUG, YII_TRACE_LEVEL이 유효한 값으로 정의되어 있고 로그 레벨이 프로파일이 아닌 경우 호출 추적 정보가 생성되어 로그 정보에 추가됩니다.
  • CLogger::log($msg,$level,$category)를 호출하여 로그를 수집합니다. 실제로 로그는 이때 파일에 기록되지 않고 메모리에 일시적으로 저장됩니다.

질문: 로그는 언제 파일에 기록되나요?
반복적인 추적 끝에 프로세서 CLogRouter::processLogs()가 CLogRouter 클래스의 init 메소드에 있는 Application 객체의 OnEndRequest 이벤트에 바인딩되어 있음을 발견했습니다. 동시에 이벤트 프로세서 CLogRouter::collectLogs 메소드는 Yii::$_logger의 onFlush 이벤트에도 바인딩됩니다. 이는 로그가 너무 많을 때 적시에 로그를 새로 고치고 파일에 쓰는 데 사용됩니다. Yii::log()의 메시지. 코드는 다음과 같습니다.

/**
 * Initializes this application component.
 * This method is required by the IApplicationComponent interface.  
*/
 public function init(){ 
  parent::init(); 
  foreach($this->_routes as $name=>$route) { 
    $route=Yii::createComponent($route);  
    $route->init();  
    $this->_routes[$name]=$route; 
  } 
  Yii::getLogger()->attachEventHandler('onFlush',array($this,'collectLogs')); 
  Yii::app()->attachEventHandler('onEndRequest',array($this,'processLogs'));}
로그인 후 복사

그리고 CApplication::run() 메소드에 정의됩니다:

 if($this->hasEventHandler('onEndRequest')) {
 $this->onEndRequest(new CEvent($this));
 }
로그인 후 복사

이 시점에서 우리는 CLogger(Yii::$_logger)가 로그를 수집(콘텐츠 구조에 기록)만 하고 프로그램이 끝나면 $app 객체가 CLogRouter의 processLogs를 호출하여 로그를 처리한다는 것을 이해할 수 있습니다. . Yii는 다중 로그 라우팅을 지원합니다. 예를 들어, 동일한 로그를 파일에 기록하거나, 페이지에 표시하거나, 이메일을 통해 동시에 보낼 수도 있고, 심지어 동시에 데이터베이스에 기록할 수도 있습니다. 구성 파일의 로그: 경로 구성은 여러 경로 배포를 달성하기 위해 log:routes에 대한 여러 요소를 구성하여 구현됩니다. 로그 정보의 필터링 및 기록은 최종 로그 프로세서에서 처리됩니다.
로그 프로세서가 완료해야 하는 작업에는 주로 다음 사항이 포함됩니다. CLogger에서 모든 로그를 가져와 필터링합니다(주로 log:routes:levels/categories로 정의된 수준 및 범주)

첫 번째 필터 및 CFileLogRoute::collectLogs()의 논리 참조:

 $logs=$logger->getLogs($this->levels,$this->categories); //执行过滤,只得到期望信息
로그인 후 복사

로그 필터링이 완료된 후 로그 최종 처리(파일 쓰기, 데이터베이스 기록 등)

 CFileLogRoute::processLogs($logs);
로그인 후 복사

하지만 이 함수에는 작은 버그가 있습니다. 로그 디렉터리에 쓰기 가능한지 여부만 확인하고, 로그 파일 자체에 쓰기 가능한지 여부는 확인하지 않습니다. CFileLogRoute는 Linux와 유사한 로그 회전 기능(LogRoate)을 구현하고 규정합니다. 로그 파일 크고 작으며, 매우 사려 깊고 완벽합니다. 저도 그에게서 배우고 그의 아이디어를 흡수하고 싶습니다! protected/config/main.php의 구성:

'preload'=>array('log'),
components => array(
       'log'=>array(
         'class'=>'CLogRouter',
         'routes'=>array(
          array(
            'class'=>'CFileLogRoute',
            'levels'=>'error, warning,trace',
          ),
         )
        )
       )
로그인 후 복사
로그 구성 요소를 정의하려면 사전 로드(인스턴스화)가 필요합니다. CLogRouter를 로그 라우팅 관리자로 구성하고 로그 라우팅 프로세서(경로 속성) 및 구성 속성을 설정합니다. 사전 로드 및 로그 속성의 정의는 CWebApplication 개체에 적용되어야 합니다(CApplication::__construct의 구성 호출을 참조하세요. 구성은 CModule에서 상속됩니다). CWebApplication의 생성자에서 preloadComponents()가 실행되면 로그 객체(즉, CLogRouter의 인스턴스)가 생성됩니다.

컴포넌트를 생성하고 초기화할 때 실제로는 CModule::getComponent가 호출됩니다. 이 호출에서는 YiiBase::createComponent를 사용하여 컴포넌트 객체를 생성한 다음 컴포넌트의 init를 호출하여 초기화합니다.
CLogRouter::init() 프로세스를 다시 읽어보세요. 여기에는 두 가지 핵심 사항이 있습니다. 하나는 로그 라우팅 프로세서를 만드는 것입니다(즉, 파일에 쓰기, 이메일 보내기 등). ), 다른 하나는 애플리케이션에 onEndRequest 이벤트 핸들러 CLogRouter::processLogs()를 바인딩하는 객체를 제공하는 것입니다. onEndRequest 이벤트 핸들러를 실행하기 위한 CApplication::run()에는 실제로 관련 코드가 있습니다.

 if($this->hasEventHandler('onEndRequest')) {
  $this->onEndRequest(new CEvent($this));
 }
로그인 후 복사

也就是说,日志的最终处理(比如写入文件,系统日志,发送邮件)是发生在应用程序运行完毕之后的。Yii使用事件机制,巧妙地实现了事件与处理句柄的关联。
也就是说,当应用程序运行完毕,将执行CLogRouter::processLogs,对日志进行处理,。CLogRouter被称之为日志路由管理器。每个日志路由处理器从CLooger对象中取得相应的日志(使用过滤机制),作最终处理。
具体而言Yii的日志系统,分为以下几个层次:

日志发送者,即程序中调用Yii::log($msg, $level, $category),将日志发送给CLogger对象
CLogger对象负责将日志记录暂存于内存之中程序运行结束后,log组件(日志路由管理器CLogRoute)的processLogs方法被激活执行,由其逐个调用日志路由器,作日志的最后处理。

更为详细的大致过程如下:

  • CApplication::__construct()中调用preloadComponents, 这导致log组件(CLogRoute)被实例化,并被调用init方法初始化。
  • log组件(CLogRoute)的init方法中,其是初始化日志路由,并给CApplication对象onEndRequest事件绑定处理流程processLogs。给CLooger组件的onFlush事件绑定处理流程collectLogs。
  • 应用程序的其它部分通过调用Yii::log()向CLogger组件发送日志信息,CLogger组件将日志信息暂存到内存中。
  • CApplication执行完毕(run方法中),会激活onEndRequest事件,绑定的事件处理器processLogs被执行,日志被写入文件之中。 Yii的日志路由机制,给日志系统扩展带来了无限的灵活。并且其多道路由处理机制,可将同一份日志信息进行多种方式处理。

这里举出一个案例:发生error级别的数据库错误时,及时给相关维护人员发送电子邮件,并同时将这些日志记录到文件之中。规划思路,发送邮件和手机短信是两个不同的功能,Yii已经带了日志邮件发送组件(logging/CEmailLogRoute.php),但这个组件中却使用了php自带的mail函数,使用mail函数需要配置php.ini中的smtp主机,并且使用非验证发送方式,这种方式在目前的实际情况下已经完全不可使用。代替地我们需要使用带验证功能的smtp发送方式。在protected/components/目录下定义日志处理器类myEmailLogRoute,并让其继承自CEmailLogRoute,最主要的目的是重写CEmailLogRoute::sendEmail()方法 ,其中,SMTP的处理细节请自行完善(本文的重点是放在如何处理日志上,而不是发送邮件上)。
接下来,我们就可以定义日志路由处理,编辑protected/config/main.php, 在log组件的routes组件添加新的路由配置:

'log'=>array(
'class'=>'CLogRouter',
'routes'=>array(
array(
'class'=>'CFileLogRoute',
'levels'=>'error, warning,trace',
),
array(
'class' => 'myEmailLogRoute',
'levels' => 'error', #所有异常的错误级别均为error, 
'categories' => 'exception.CDbException', #数据库产生错误时,均会产生CDbException异常。
'host' => 'mail.163.com',
'port' => 25,
'user' => 'jeff_yu',
'password' => 'you password',
'timeout' => 30,
'emails' => 'jeff_yu@gmail.com', #日志接收人。
'sentFrom' => 'jeff_yu@gmail.com',
),
로그인 후 복사

经过以上处理,即可使之实现我们的目的,当然你可以根据自己的需要进一步扩展之。

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. 크로스 플레이가 있습니까?
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드 Dec 24, 2024 pm 04:42 PM

PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법 PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법 Dec 20, 2024 am 11:31 AM

VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는

이전에 몰랐던 후회되는 PHP 함수 7가지 이전에 몰랐던 후회되는 PHP 함수 7가지 Nov 13, 2024 am 09:42 AM

숙련된 PHP 개발자라면 이미 그런 일을 해왔다는 느낌을 받을 것입니다. 귀하는 상당한 수의 애플리케이션을 개발하고, 수백만 줄의 코드를 디버깅하고, 여러 스크립트를 수정하여 작업을 수행했습니다.

PHP에서 HTML/XML을 어떻게 구문 분석하고 처리합니까? PHP에서 HTML/XML을 어떻게 구문 분석하고 처리합니까? Feb 07, 2025 am 11:57 AM

이 튜토리얼은 PHP를 사용하여 XML 문서를 효율적으로 처리하는 방법을 보여줍니다. XML (Extensible Markup Language)은 인간의 가독성과 기계 구문 분석을 위해 설계된 다목적 텍스트 기반 마크 업 언어입니다. 일반적으로 데이터 저장 AN에 사용됩니다

JWT (JSON Web Tokens) 및 PHP API의 사용 사례를 설명하십시오. JWT (JSON Web Tokens) 및 PHP API의 사용 사례를 설명하십시오. Apr 05, 2025 am 12:04 AM

JWT는 주로 신분증 인증 및 정보 교환을 위해 당사자간에 정보를 안전하게 전송하는 데 사용되는 JSON을 기반으로 한 개방형 표준입니다. 1. JWT는 헤더, 페이로드 및 서명의 세 부분으로 구성됩니다. 2. JWT의 작업 원칙에는 세 가지 단계가 포함됩니다. JWT 생성, JWT 확인 및 Parsing Payload. 3. PHP에서 인증에 JWT를 사용하면 JWT를 생성하고 확인할 수 있으며 사용자 역할 및 권한 정보가 고급 사용에 포함될 수 있습니다. 4. 일반적인 오류에는 서명 검증 실패, 토큰 만료 및 대형 페이로드가 포함됩니다. 디버깅 기술에는 디버깅 도구 및 로깅 사용이 포함됩니다. 5. 성능 최적화 및 모범 사례에는 적절한 시그니처 알고리즘 사용, 타당성 기간 설정 합리적,

문자열로 모음을 계산하는 PHP 프로그램 문자열로 모음을 계산하는 PHP 프로그램 Feb 07, 2025 pm 12:12 PM

문자열은 문자, 숫자 및 기호를 포함하여 일련의 문자입니다. 이 튜토리얼은 다른 방법을 사용하여 PHP의 주어진 문자열의 모음 수를 계산하는 방법을 배웁니다. 영어의 모음은 A, E, I, O, U이며 대문자 또는 소문자 일 수 있습니다. 모음이란 무엇입니까? 모음은 특정 발음을 나타내는 알파벳 문자입니다. 대문자와 소문자를 포함하여 영어에는 5 개의 모음이 있습니다. a, e, i, o, u 예 1 입력 : String = "Tutorialspoint" 출력 : 6 설명하다 문자열의 "Tutorialspoint"의 모음은 u, o, i, a, o, i입니다. 총 6 개의 위안이 있습니다

PHP에서 늦은 정적 결합을 설명하십시오 (정적 : :). PHP에서 늦은 정적 결합을 설명하십시오 (정적 : :). Apr 03, 2025 am 12:04 AM

정적 바인딩 (정적 : :)는 PHP에서 늦은 정적 바인딩 (LSB)을 구현하여 클래스를 정의하는 대신 정적 컨텍스트에서 호출 클래스를 참조 할 수 있습니다. 1) 구문 분석 프로세스는 런타임에 수행됩니다. 2) 상속 관계에서 통화 클래스를 찾아보십시오. 3) 성능 오버 헤드를 가져올 수 있습니다.

php magic 방법 (__construct, __destruct, __call, __get, __set 등)이란 무엇이며 사용 사례를 제공합니까? php magic 방법 (__construct, __destruct, __call, __get, __set 등)이란 무엇이며 사용 사례를 제공합니까? Apr 03, 2025 am 12:03 AM

PHP의 마법 방법은 무엇입니까? PHP의 마법 방법은 다음과 같습니다. 1. \ _ \ _ Construct, 객체를 초기화하는 데 사용됩니다. 2. \ _ \ _ 파괴, 자원을 정리하는 데 사용됩니다. 3. \ _ \ _ 호출, 존재하지 않는 메소드 호출을 처리하십시오. 4. \ _ \ _ get, 동적 속성 액세스를 구현하십시오. 5. \ _ \ _ Set, 동적 속성 설정을 구현하십시오. 이러한 방법은 특정 상황에서 자동으로 호출되어 코드 유연성과 효율성을 향상시킵니다.

See all articles