>  기사  >  백엔드 개발  >  Yii Framework 공식 튜토리얼 보충 자료 45 - 특별 주제: 로깅

Yii Framework 공식 튜토리얼 보충 자료 45 - 특별 주제: 로깅

黄舟
黄舟원래의
2017-02-16 09:34:001617검색



Yii는 유연하고 확장 가능한 로깅 기능을 제공합니다. 기록된 로그는 로그 수준 및 정보 분류별로 분류할 수 있습니다. 수준 및 범주 필터를 사용하면 선택한 정보를 파일, 이메일, 브라우저 창 등과 같은 다른 대상으로 추가로 라우팅할 수 있습니다.

1. 정보 기록

Yii::log 또는 Yii::trace를 통해 정보를 기록할 수 있습니다. 차이점은 후자는 애플리케이션이 디버그 모드에서 실행될 때만 정보를 기록한다는 것입니다.


Yii::log($message, $level, $category);
Yii::trace($message, $category);

정보를 기록할 때 해당 카테고리와 레벨을 지정해야 합니다. 카테고리는 경로와 유사한 형식입니다. 별칭 문자열. 예를 들어 메시지가 CController에 기록되면 system.web.CController를 분류로 사용할 수 있습니다. 정보 수준은 다음 값 중 하나여야 합니다.

  • trace: Yii::trace에서 사용되는 수준입니다. 개발 중에 프로그램의 실행 흐름을 추적하는 데 사용됩니다.

  • info : 일반적인 정보를 기록하는데 사용됩니다.

  • 프로필: 공연 개요(프로필)입니다. 더 자세한 지침은 곧 이어질 것입니다.

  • 경고: 경고 정보에 사용됩니다.

  • error: 치명적인 오류 메시지에 사용됩니다.

2. 정보 라우팅

Yii::log 또는 Yii::trace를 통해 기록된 정보는 메모리에 저장됩니다. 일반적으로 브라우저 창에 표시하거나 파일이나 이메일과 같은 영구 저장소에 저장해야 합니다. 이를 정보 라우팅이라고 합니다. 예를 들어 정보를 다른 목적지로 보내는 것입니다.

Yii에서 정보 라우팅은 CLogRouter라는 애플리케이션 구성 요소에 의해 관리됩니다. 로그 경로라는 일련의 항목을 관리합니다. 각 로그 경로는 별도의 로그 대상을 나타냅니다. 로그 경로를 통해 전송된 메시지는 해당 수준 및 카테고리별로 필터링됩니다.

메시지 라우팅을 사용하려면 CLogRouter 애플리케이션 구성 요소를 설치하고 사전 로드해야 합니다. 또한 원하는 로그 경로에 대한 경로 속성을 구성해야 합니다. 아래 코드는 필수 애플리케이션 구성의 예를 보여줍니다.


array(
    ......
    'preload'=>array('log'),
    'components'=>array(
        ......
        'log'=>array(
            'class'=>'CLogRouter',
            'routes'=>array(
                array(
                    'class'=>'CFileLogRoute',
                    'levels'=>'trace, info',
                    'categories'=>'system.*',
                ),
                array(
                    'class'=>'CEmailLogRoute',
                    'levels'=>'error, warning',
                    'emails'=>[email protected]',
                ),
            ),
        ),
    ),
)

위 예에서는 두 개의 로그 경로를 정의합니다. . 첫 번째는 CFileLogRoute로, 애플리케이션의 런타임 디렉터리에 있는 파일에 정보를 저장합니다. 그리고 레벨 추적이나 정보 및 시스템으로 시작하는 카테고리가 있는 정보만 저장됩니다. 두 번째 경로는 CEmailLogRoute입니다. 이는 지정된 이메일 주소로 정보를 보내고 오류 또는 경고 수준만 전송됩니다.

Yii에서는 다음과 같은 로그 경로를 사용할 수 있습니다.

  • CDbLogRoute: 정보를 데이터베이스의 테이블에 저장합니다.

  • CEmailLogRoute: 지정된 이메일 주소로 정보를 보냅니다.

  • CFileLogRoute: 정보를 애플리케이션의 런타임 디렉터리에 있는 파일에 저장합니다.

  • CWebLogRoute: 현재 페이지 하단에 정보를 표시합니다.

  • CProfileLogRoute: 페이지 하단에 프로파일링 정보를 표시합니다.

정보: 정보 라우팅은 현재 요청 주기의 마지막 onEndRequest 이벤트가 트리거될 때 발생합니다. 현재 요청 프로세스를 명시적으로 종료하려면 die()나 exit()를 사용하는 대신 CApplication::end()를 호출해야 합니다. CApplication::end()는 정보가 원활하게 기록되도록 onEndRequest 이벤트를 트리거하기 때문입니다.

3. 메시지 필터링

앞서 말씀드린 것처럼 메시지는 로그 라우터로 전송되기 전에 수준과 카테고리별로 필터링할 수 있습니다. 이는 해당 로그 경로의 수준 및 범주 속성을 설정하여 수행됩니다. 여러 수준이나 범주는 쉼표로 연결되어야 합니다.

정보 분류가 xxx.yyy.zzz 형식과 유사하므로 분류 수준이라고 볼 수 있습니다. 구체적으로 말하면, xxx는 xxx.yyy의 부모이고, 이는 다시 xxx.yyy.zzz의 부모입니다. 이러한 방식으로 xxx.*를 사용하여 범주 xxx와 모든 하위 및 손자 범주를 나타낼 수 있습니다.

4. 상황별 정보 기록

버전 1.0.6부터 PHP의 사전 정의된 변수(예: $_GET, $_SERVER), 세션과 같은 추가 상황 정보를 기록하도록 설정할 수 있습니다. ID, 사용자 이름 등 이는 로그 경로의 CLogRoute::filter 특성에 적합한 로그 필터링 규칙을 지정하여 수행됩니다.

框架使用非常方面的可以用于大多数日志过滤的CLogFilter,默认情况下, CLogFilter 将会记录一条包含变量(如通常包含系统上下文变量值的如$_GET,$_SERVER等)的信息。CLogFilter还可以用于配置到每一个日志信息之前,带上session ID,用户名等。当我们要查找日志信息的位置时这将带来极大的便利 。

下面的配置展示了如何开启记录上下文信息。每一个日志路由都有自己的日志过滤器,但是默认情况下, 日志路由并不包含日志过滤器。


array(
    ......
    'preload'=>array('log'),
    'components'=>array(
        ......
        'log'=>array(
            'class'=>'CLogRouter',
            'routes'=>array(
                array(
                    'class'=>'CFileLogRoute',
                    'levels'=>'error',
                    'filter'=>'CLogFilter',
                ),
                ...other log routes...
            ),
        ),
    ),
)

从版本1.0.7开始,Yii支持记录通过调用Yii::trace返回的日志记录信息中的回调栈信息。这一特性默认是取消的,因为这回降低性能。想要使用这一特性,只需在入口脚本中定义一个名为YII_TRACE_LEVEL的大于0的常量 (在包含yii.php之前),然后Yii将会在每一个trace信息之后加上应用代码回调栈的文件名和行号。 YII_TRACE_LEVEL 决定了每一个回调栈的层级将会被记录。这个信息在开发期间很有用,因为这可以帮助我们确定触发trace信息的位置。

5. 性能分析

性能分析是一个特殊的日志记录类型。性能分析可以用于衡量指定代码块的运行时间,并且找出性能瓶颈。

使用性能分析,我们需要指定被分析的代码块。我们通过插入如下代码来标记每一个代码块的开始和结束:


Yii::beginProfile('blockID');
...code block being Yii Framework 공식 튜토리얼 보충 자료 45 - 특별 주제: 로깅d...
Yii::endProfile('blockID');

其中blockID 指的是代码块的唯一标志符.

注意, 代码块需要被合理嵌套。也就是说,一个代码块不能和另一代码块交叉嵌套:要么是并行的,要么是完全封闭包含在另一个代码块里。

为了显示分析结果, 需要安装 一个包含CProfileLogRoute日志路由的CLogRouter 应用组件。这和我们处理其他的信息路由一样,CProfileLogRoute路由将会在当前页面的底部显示性能分析结果。

Yii Framework 공식 튜토리얼 보충 자료 45 - 특별 주제: 로깅

6. SQL执行分析

性能分析在处理数据库操作时尤为有用,因为 SQL 执行经常是一个应用主要的性能瓶颈。 我们当然可以在每一次SQL执行的地方插入beginProfile 和 endProfile语句, 从版本1.0.6开始, 但Yii 提供了一个更加系统的方式来解决这个问题。

通过在应用配置中设置 CDbConnection::enableProfiling 为true, 每一个被执行的SQL语句都会被分析. 结果可以通过设置前面提到的CProfileLogRoute来显示, 这样我们就能知晓每一个SQL语句的执行时间。除此之外我们还可以调用CDbConnection::getStats() 来取回SQL语句执行的次数和总的执行时间。

 以上就是Yii框架官方教程增补版45——专题:日志记录的内容,更多相关内容请关注PHP中文网(www.php.cn)!


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