小編給大家分享一下PHP中Yii框架常用日志操作的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
汨羅ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!日志
Yii提供了一個高度自定義化和高擴(kuò)展性的日志框架。根據(jù)使用場景的不同,你可以很容易的對各種消息就行記錄、過濾、合并,比如說文本文件,數(shù)據(jù)庫文件,郵件。
使用Yii的日志框架包含如下步驟:
調(diào)用日志記錄的方法
在主應(yīng)用的配置文件(例如basic下面的web.php)中配置好日志的過濾和導(dǎo)出的設(shè)置
檢查不同場景下經(jīng)過過濾之后的日志信息
記錄日志
記錄日志其實(shí)就是簡簡單單的調(diào)用如下的方法:
[[Yii::trace()]]: 記錄關(guān)于某段代碼運(yùn)行的相關(guān)消息。主要是用于開發(fā)環(huán)境。
[[Yii::info()]]: 在某些位置記錄一些比較有用的信息的時候使用。
[[Yii::warning()]]: 當(dāng)某些期望之外的事情發(fā)生的時候,使用該方法。
[[Yii::error()]]: 當(dāng)某些需要立馬解決的致命問題發(fā)生的時候,調(diào)用此方法記錄相關(guān)信息。
上面的這些方法雖然根據(jù)不同的level和類型來記錄信息,但是實(shí)際上它們調(diào)用的是同一個方法function($message, $category = 'application')。其中$message就是要記錄的信息,$category表示的是這個日志的歸屬類。下面的代碼表示在默認(rèn)的‘a(chǎn)pplication'分類下面記錄了一條trace類型的信息。
Yii::trace('start calculating average revenue');
提示:記錄的$message可以是簡單的string也可以是復(fù)雜的數(shù)組、對象。你應(yīng)該根據(jù)不同的場景下日志記錄的職責(zé)選取合適的$message類型。默認(rèn)情況下,如果你記錄的$message不是String,日志在導(dǎo)出的時候都會調(diào)用[[yii\helpers\VarDumper::export()]] 方法來輸出一個string類型的消息。
為了更好的組織管理及篩選日志消息,通常情況下應(yīng)當(dāng)為每一種日志分配合適的類別。你可以選擇一種有明顯等級區(qū)分意思的分類,用以方便根據(jù)不同的目的來篩選不同分類的日志。一種簡單且有效的命名方式就是使用PHP的魔術(shù)常量METHOD來作為分類的名稱。Yii框架里面的核心代碼在做日志記錄的時候就是這么干的。比如說:
Yii::trace('start calculating average revenue', __METHOD__);
在有常量METHOD出現(xiàn)的地方,它表示的就是當(dāng)前的方法的名稱(并且加上了當(dāng)前方法所屬的類的完整前綴)。舉個例子吧,如果在app\controllers\RevenueController這個類里面的calculate方法里面有上面的那行代碼,那么此時的METHOD表示的就是‘a(chǎn)pp\controllers\RevenueController::calculate'。
提示:上面所說的方法事實(shí)上只是單例對象[[yii\log\Logger|logger object]] 的[[yii\log\Logger::log()|log()]]方法的簡單使用,我們可以通過Yii::getLogger()方法來獲得這個單例對象。當(dāng)我們記錄了足夠的日志信息或者當(dāng)前的應(yīng)用運(yùn)行結(jié)束了,日志對象將調(diào)用[yii\log\Dispatcher|message dispatcher]] 方法把記錄的日志信息寫入到配置的目的位置。
log targets
一個log target是[[yii\log\Target]]或者其子類的實(shí)例。它根據(jù)嚴(yán)重的等級和分類類過濾日志,然后把日志導(dǎo)出到合適的媒介上面去。就比如說,一個[[yii\log\DbTarget|database target]] 對象就會把過濾之后的日志信息導(dǎo)出到對應(yīng)數(shù)據(jù)庫。
你可以在應(yīng)用的配置文件中的日志組件處注冊多個log targets,就像下面這樣:
return [ // the "log" component must be loaded during bootstrapping time 'bootstrap' => ['log'], 'components' => [ 'log' => [ 'targets' => [ [ 'class' => 'yii\log\DbTarget', 'levels' => ['error', 'warning'], ], [ 'class' => 'yii\log\EmailTarget', 'levels' => ['error'], 'categories' => ['yii\db\*'], 'message' => [ 'from' => ['log@example.com'], 'to' => ['admin@example.com', 'developer@example.com'], 'subject' => 'Database errors at example.com', ], ], ], ], ], ];
注意:日志組件必須在bootstrap中配置,這樣才能把日志信息分發(fā)到對應(yīng)的log target.
上面的代碼里面,兩個log target注冊到了[[yii\log\Dispatcher::targets]]里面。
第一個篩選出錯誤和警告信息并且把這些信息保存到了數(shù)據(jù)庫。
第二個篩選出分類以yii\db*開頭的錯誤信息,并把這些信息通過郵件發(fā)送到admin@example.com 和 developer@example.com.
Yii有下面這些內(nèi)置的log targets,你可以參考API文檔來學(xué)習(xí)具體怎么去配置和使用它們。
[[yii\log\DbTarget]]:把日志信息保存到數(shù)據(jù)庫。
[[yii\log\EmailTarget]]: 把日志信息發(fā)送到指定的郵箱,上面的例子就是。
[[yii\log\FileTarget]]: 把日志寫到到文件。
[[yii\log\SyslogTarget]]: 調(diào)用PHP的syslog()方法將日志寫入到系統(tǒng)日志。
接下來,我們就來看看常見的log target具有的功能。
消息過濾
就每一種log target而言,你可以配置它的 [[yii\log\Target::levels|levels]] 和 [[yii\log\Target::categories|categories]]屬性類設(shè)置它的嚴(yán)重程度以及歸屬的分類。
[[yii\log\Target::levels|levels]]屬性的采用一個數(shù)組里面的一個或者多個值,這個數(shù)組包含如下值:
error:對應(yīng)[[Yii::error()]]記錄的消息
warning:對應(yīng)[[Yii::warning()]]記錄的消息
info :對應(yīng) [[Yii::info()]]記錄的信息
trace:對應(yīng) [[Yii::trace()]]記錄的信息.
profile :對應(yīng)[[Yii::beginProfile()]] 和 [[Yii::endProfile()]]記錄的信息,這種方式下面更多詳細(xì)信息會被記錄。
如果你沒有指定[[yii\log\Target::levels|levels]] 的值,那么任何level的信息都會被記錄。
[[yii\log\Target::categories|categories]] 屬性的值是數(shù)組,這個數(shù)組里面的值可以是一個具體的分類名稱,也可以是類似正則的匹配模式。只有在target能在這個數(shù)組里面找到對應(yīng)的分類名或者符合某一個匹配模式,他才會處理這些消息。這里的匹配模式的組成是在分類的名稱后面加上一個號。如果這個分類恰好和這個匹配模式的號前的字符匹配,那么也就是這個分類找到對應(yīng)匹配值。舉個例來說,在類[[yii\db\Command]]中的yii\db\Command::execute和yii \db\Command:: query 方法使用類名類記錄相關(guān)日志信息,那么這個時候他們都匹配模式y(tǒng)ii\db*
同樣的,如果我們沒有指定[[yii\log\Target::categories|categories]],那么每一種分類的日志信息都會被處理。
除了通過[[yii\log\Target::categories|categories]] 屬性來設(shè)置分類的白名單外,你也可以通過 [[yii\log\Target::except|except]]屬性來設(shè)置分類的黑名單。屬于黑名單的分類日志信息不會被target處理。
下面的配置指定了一個分類匹配yii\db*或者 yii\web\HttpException:*,但又不包括yii\web\HttpException:404的分類,而且它只處理錯誤和警告的日志信息。
[ 'class' => 'yii\log\FileTarget', 'levels' => ['error', 'warning'], 'categories' => [ 'yii\db\*', 'yii\web\HttpException:*', ], 'except' => [ 'yii\web\HttpException:404', ], ]
注意:當(dāng)錯誤的句柄捕獲到HTTP的異常的時候,記錄的日志信息會以yii\web\HttpException:ErrorCode的這種格式
記錄,例如[[yii\web\NotFoundHttpException]] 就會被記錄成yii\web\HttpException:404
消息格式化
日志targets用多種格式來導(dǎo)出日志。舉個例子,如果你的日志target是[[yii\log\FileTarget]],那么你在你的程序中記錄日志的時候,應(yīng)該會找到類似于文件runtime/log/app.log 記錄的如下的信息:
2014-10-04 18:10:15 [::1][][-][trace][yii\base\Module::getModule] Loading module: debug
默認(rèn)情況下,[[yii\log\Target::formatMessage()]]:會幫我們把日志信息格式化成下面的這種格式:
Timestamp [IP address][User ID][Session ID][Severity Level][Category] Message Text
你可以通過給[[yii\log\Target::prefix]] 屬性配置一個自定義的回調(diào)函數(shù)來 自定義日志的前綴。下面的代碼就實(shí)現(xiàn)了在每條日志信息前面加上了用戶的ID(ip地址,sessionId等敏感信息因?yàn)閭€人隱私被去掉了)。
[ 'class' => 'yii\log\FileTarget', 'prefix' => function ($message) { $user = Yii::$app->has('user', true) ? Yii::$app->get('user') : null; $userID = $user ? $user->getId(false) : '-'; return "[$userID]"; } ]
除了日志消息的前綴,日志的target還把一些上下文信息附加在了每一批的日志記錄中。默認(rèn)情況下,全局的PHP變量包含$_GET, $_POST, $_FILES, $_COOKIE, $_SESSION 和 $_SERVER. 你可以通過配置 [[yii\log\Target::logVars]] 來調(diào)整日志記錄的全局變量。下面的代碼表示的是只記錄$_SERVER相關(guān)的變量。
[ 'class' => 'yii\log\FileTarget', 'logVars' => ['_SERVER'], ]
當(dāng) 'logVars'為空的時候,表示不記錄相關(guān)的上下文信息。如果你想自定義上下文信息的提供方式,你可以覆寫[[yii\log\Target::getContextMessage()]] 方法。
消息的trace等級
在開發(fā)的過程當(dāng)中,我們總是期望能夠知道每一條日志消息是來自哪里。在Yii中你可以通過配置[[yii\log\Dispatcher::traceLevel|traceLevel]] 屬性來實(shí)現(xiàn)。配置的示例如下:
return [ 'bootstrap' => ['log'], 'components' => [ 'log' => [ 'traceLevel' => YII_DEBUG ? 3 : 0, 'targets' => [...], ], ], ];
上面的示例在YII_DEBUG為true的時候?qū)[yii\log\Dispatcher::traceLevel|traceLevel]] 設(shè)置為3,反之設(shè)置為0. 意思是什么呢?3表示每一條日志記錄都會記錄與之相關(guān)的三層棧調(diào)用信息,0表示不記錄任何相關(guān)的棧調(diào)用信息
提示:沒有必要總是記錄調(diào)用的堆棧信息,比較耗性能。所以,你應(yīng)該只在你開發(fā)的時候或者用于調(diào)試的情況下使用該功能。
消息的清空和導(dǎo)出
就如同上面說的,記錄的消息以數(shù)組的形式保存在[[yii\log\Logger|logger object]]中。為了限制這個數(shù)組消耗過多的內(nèi)存,當(dāng)這個數(shù)組包含的內(nèi)容大小達(dá)到某個量的時候會被對應(yīng)的target從內(nèi)存中轉(zhuǎn)移到對應(yīng)的目標(biāo)(文件,數(shù)據(jù)庫...)中。你可以通過設(shè)置 [[yii\log\Dispatcher::flushInterval|flushInterval]] 的值來決定量的大小。像下面這樣:
return [ 'bootstrap' => ['log'], 'components' => [ 'log' => [ 'flushInterval' => 100, // default is 1000 'targets' => [...], ], ], ];
注意:在應(yīng)用運(yùn)行結(jié)束的時候也會刷新內(nèi)存,這樣做事為了讓日志的target能夠記錄完整的信息。
把日志信息從內(nèi)存刷到對應(yīng)存放的地方的這一動作不是立即發(fā)生的。事實(shí)上,和上面一樣,都是當(dāng)內(nèi)存中的日志大小達(dá)到一定程度才會發(fā)生。你可以像下面的示例一樣通過配置不同target的[[yii\log\Target::exportInterval|exportInterval]]值,來達(dá)到修改的目的:
[ 'class' => 'yii\log\FileTarget', 'exportInterval' => 100, // default is 1000 ]
因?yàn)榍蹇蘸蛯?dǎo)出的設(shè)定,默認(rèn)情況下你調(diào)用 Yii::trace() 或者其他的日志記錄方法的時候不會在日志target下立馬看到日志消息。這對某些長時間運(yùn)行的控制臺程序是一個問題。不過這個問題是可以解決的,方法入下面的代碼,你需要把[[yii\log\Dispatcher::flushInterval|flushInterval]] 和[[yii\log\Target::exportInterval|exportInterval]] 的值都設(shè)置成1:
return [ 'bootstrap' => ['log'], 'components' => [ 'log' => [ 'flushInterval' => 1, 'targets' => [ [ 'class' => 'yii\log\FileTarget', 'exportInterval' => 1, ], ], ], ], ];
注意:如此頻繁的清空和導(dǎo)出日志消息會降低系統(tǒng)的性能。
切換日志的targets
你可以通過設(shè)置[[yii\log\Target::enabled|enabled]] 屬性來禁止日志的target。就如同下面的代碼描述的一樣:
Yii::$app->log->targets['file']->enabled = false;
上面的代碼需要你在配置文件里面有一個下面的配置:
return [ 'bootstrap' => ['log'], 'components' => [ 'log' => [ 'targets' => [ 'file' => [ 'class' => 'yii\log\FileTarget', ], 'db' => [ 'class' => 'yii\log\DbTarget', ], ], ], ], ];
創(chuàng)建一個新的target
首先,創(chuàng)建一個新的日志target是很簡單的。你主要做的事情是實(shí)現(xiàn)[[yii\log\Target::export()]] 方法并且把數(shù)組類型的消息[[yii\log\Target::messages]]發(fā)送到指定的存儲媒介上去就行了。在這個過程中你可以調(diào)用[[yii\log\Target::formatMessage()]] 方法來格式化每一條日志消息。至于更多的細(xì)節(jié)你可以在Yiid的發(fā)行版本里找到詳細(xì)的信息。
性能評測
性能評測是一種比較特別的日志記錄。它通常用來獲取某些模塊執(zhí)行時間的數(shù)據(jù),以此來找到性能的問題所在。比如說,[[yii\db\Command]] 這個類就用性能評測日志來獲得每一條sql查詢所花費(fèi)的時間。
要使用該類日志,你首先要做的時確定你要測試的代碼范圍。然后在每一段代碼之間你都應(yīng)該要保持它們是閉合的,就像下面這個樣子:
\Yii::beginProfile('myBenchmark'); ...code block being profiled... \Yii::endProfile('myBenchmark');
myBenchmark只是一個標(biāo)識,用于你在查看對應(yīng)日志記錄的時候快速定位。
在beginProfile和endProfile之間是可以再嵌套的,但是必須保證正確的閉合關(guān)系,如下所示:
\Yii::beginProfile('block1'); // some code to be profiled \Yii::beginProfile('block2'); // some other code to be profiled \Yii::endProfile('block2'); \Yii::endProfile('block1');
如果上面的閉合關(guān)系出錯了,對應(yīng)的記錄都不會正常工作。
對于每一塊被評測的代碼,日志的level都是profile。你可以再日志的target中配置這些信息并導(dǎo)出它們。 Yii內(nèi)建了 Yii debugger來展示評測的結(jié)果。
以上是“PHP中Yii框架常用日志操作的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
網(wǎng)站欄目:PHP中Yii框架常用日志操作的示例分析-創(chuàng)新互聯(lián)
本文路徑:http://jinyejixie.com/article8/ccpeop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、品牌網(wǎng)站制作、云服務(wù)器、微信公眾號、定制網(wǎng)站、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容