搜尋
首頁後端開發php教程Yii框架官方教學增補版45-專題:日誌記錄



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
unset()和session_destroy()有什麼區別?unset()和session_destroy()有什麼區別?May 04, 2025 am 12:19 AM

Thedifferencebetweenunset()andsession_destroy()isthatunset()clearsspecificsessionvariableswhilekeepingthesessionactive,whereassession_destroy()terminatestheentiresession.1)Useunset()toremovespecificsessionvariableswithoutaffectingthesession'soveralls

在負載平衡的情況下,什麼是粘性會話(會話親和力)?在負載平衡的情況下,什麼是粘性會話(會話親和力)?May 04, 2025 am 12:16 AM

stickysessensureuserRequestSarerOutedTothesMeServerForsessionDataConsisterency.1)sessionIdentificeAssificationAssigeaSsignAssignSignSuserServerServerSustersusiseCookiesorUrlModifications.2)一致的ententRoutingDirectSsssssubsequeSssubsequeSubsequestrequestSameSameserver.3)loadBellankingDisteributesNebutesneNewuserEreNevuseRe.3)

PHP中有哪些不同的會話保存處理程序?PHP中有哪些不同的會話保存處理程序?May 04, 2025 am 12:14 AM

phpoffersvarioussessionsionsavehandlers:1)文件:默認,簡單的ButMayBottLeneckonHigh-trafficsites.2)Memcached:高性能,Idealforsforspeed-Criticalapplications.3)REDIS:redis:similartomemememememcached,withddeddeddedpassistence.4)withddeddedpassistence.4)databases:gelifforcontrati forforcontrati,有用

PHP中的會話是什麼?為什麼使用它們?PHP中的會話是什麼?為什麼使用它們?May 04, 2025 am 12:12 AM

PHP中的session是用於在服務器端保存用戶數據以在多個請求之間保持狀態的機制。具體來說,1)session通過session_start()函數啟動,並通過$_SESSION超級全局數組存儲和讀取數據;2)session數據默認存儲在服務器的臨時文件中,但可通過數據庫或內存存儲優化;3)使用session可以實現用戶登錄狀態跟踪和購物車管理等功能;4)需要注意session的安全傳輸和性能優化,以確保應用的安全性和效率。

說明PHP會話的生命週期。說明PHP會話的生命週期。May 04, 2025 am 12:04 AM

PHPsessionsstartwithsession_start(),whichgeneratesauniqueIDandcreatesaserverfile;theypersistacrossrequestsandcanbemanuallyendedwithsession_destroy().1)Sessionsbeginwhensession_start()iscalled,creatingauniqueIDandserverfile.2)Theycontinueasdataisloade

絕對會話超時有什麼區別?絕對會話超時有什麼區別?May 03, 2025 am 12:21 AM

絕對會話超時從會話創建時開始計時,閒置會話超時則從用戶無操作時開始計時。絕對會話超時適用於需要嚴格控制會話生命週期的場景,如金融應用;閒置會話超時適合希望用戶長時間保持會話活躍的應用,如社交媒體。

如果會話在服務器上不起作用,您將採取什麼步驟?如果會話在服務器上不起作用,您將採取什麼步驟?May 03, 2025 am 12:19 AM

服務器會話失效可以通過以下步驟解決:1.檢查服務器配置,確保會話設置正確。 2.驗證客戶端cookies,確認瀏覽器支持並正確發送。 3.檢查會話存儲服務,如Redis,確保其正常運行。 4.審查應用代碼,確保會話邏輯正確。通過這些步驟,可以有效診斷和修復會話問題,提升用戶體驗。

session_start()函數的意義是什麼?session_start()函數的意義是什麼?May 03, 2025 am 12:18 AM

session_start()iscucialinphpformanagingusersessions.1)ItInitiateSanewsessionifnoneexists,2)resumesanexistingsessions,and3)setsasesessionCookieforContinuityActinuityAccontinuityAcconActInityAcconActInityAcconAccRequests,EnablingApplicationsApplicationsLikeUseAppericationLikeUseAthenticationalticationaltication and PersersonalizedContentent。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。