首頁  >  文章  >  後端開發  >  Yii框架官方教學增補版45-專題:日誌記錄

Yii框架官方教學增補版45-專題:日誌記錄

黄舟
黄舟原創
2017-02-16 09:34:001610瀏覽



Yii 提供了一個靈活可擴展的日誌功能。記錄的日誌 可以透過日誌等級和資訊分類進行歸類。透過使用 等級和分類過濾器,所選的資訊還可以進一步路由到 不同的目的地,例如一個文件,Email,瀏覽器視窗等。

1. 資訊記錄

資訊可以透過 Yii::log 或 Yii::trace 記錄。其差異在於後者只在當應用程式運行在偵錯模式(debug mode) 中時才會記錄資訊。


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

當記錄資訊時,我們需要指定它的分類和等級 分類是一段格式類似於路徑別名的字串。 例如,如果一則資訊是在 CController 中記錄的,我們可以使用 system.web.CController 作為分類。資訊等級應該是下列數值中的一種:

  • trace: 這是在 Yii::trace 中使用的層級。它用於在開發中 追蹤程式的執行流程。

  • info: 這個用來記錄普通的資訊。

  • Yii框架官方教學增補版45-專題:日誌記錄: 這個是效能概述(Yii框架官方教學增補版45-專題:日誌記錄)。下面馬上會有更詳細的說明。

  • warning: 這個用於警告(warning)訊息。

  • error: 這個用於致命錯誤(fatal error)訊息。

2. 訊息路由

透過 Yii::log 或 Yii::trace 所記錄的資料是保存在記憶體中的。 我們通常需要將它們顯示到瀏覽器視窗中,或將他們保存到一些 持久性儲存例如文件、Email中。這個就叫作訊息路由,例如, 發送訊息到不同的目的地。

在 Yii 中,訊息路由是由一個叫做 CLogRouter 的應用元件所管理的。 它負責管理一系列稱作日誌路由的東西。每個日誌路由 代表一個單獨的日誌目的地。透過一個日誌路由發送的訊息會被他們的等級和分類過濾。

要使用資訊路由,我們需要安裝並預先載入一個 CLogRouter 應用元件。我們也還需要配置它的 routes 屬性為我們想要的那些日誌路由。 下面的程式碼示範了一個所需的 應用程式設定 範例:


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 ,它會把資訊保存在位於應用程式 runtime 目錄中的一個檔案中。 而且只有等級為 trace 或 info 、分類以 system. 開頭的資料才會被儲存。 第二個路由是 CEmailLogRoute ,它會將訊息傳送到指定的 email 位址,只有層級為 error 或 warning 的才會傳送。

在 Yii 中,有下列幾種日誌路由可用:

  • CDbLogRoute: 將資訊儲存到資料庫的表中。

  • CEmailLogRoute: 發送訊息到指定的 Email 位址。

  • CFileLogRoute: 將資訊儲存到應用程式 runtime 目錄中的一個檔案。

  • CWebLogRoute: 將 資訊顯示在目前頁面的底部。

  • CProfileLogRoute: 在頁面的底部顯示概述(profiling)資訊。

訊息: 訊息路由發生在當前請求週期最後的 onEndRequest 事件觸發。 若要明確終止目前請求流程,請呼叫 CApplication::end() 而非使用 die() 或 exit(),因為 CApplication::end() 將會觸發onEndRequest 事件,因此資訊才會順利記錄 這樣。

3. 訊息過濾

正如我們所提到的,訊息可以在他們被發送到一個日誌路由之前通過它們的層級和分類過濾。 這是透過設定對應日誌路由的 levels 和 categories 屬性來完成的。 多個級別或分類應使用逗號連接。

由於資訊分類是類似 xxx.yyy.zzz 格式的,我們可以視為一個分類層級。 具體地,我們說 xxx 是 xxx.yyy的父級,而xxx.yyy 又是 xxx.yyy.zzz 的父級。 這樣我們就可以使用 xxx.* 表示分類 xxx 及其所有的子級和孫級分類。

4. 記錄上下文資訊

從版本 1.0.6 起,我們可以設定記錄附加的上下文信息, 例如 PHP 的預定義變數(例如 $_GET, $_SERVER),session 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框架官方教學增補版45-專題:日誌記錄d...
Yii::endProfile('blockID');

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

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

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

Yii框架官方教學增補版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