亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

PHP的Yii框架的常用日志操作總結

2024-05-04 23:40:49
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了PHP的Yii框架的常用日志操作總結,包括消息的過略和格式化等基本內容,需要的朋友可以參考下
 

日志
Yii提供了一個高度自定義化和高擴展性的日志框架。根據使用場景的不同,你可以很容易的對各種消息就行記錄、過濾、合并,比如說文本文件,數據庫文件,郵件。

使用Yii的日志框架包含如下步驟:

調用日志記錄的方法

  • 在主應用的配置文件(例如basic下面的web.php)中配置好日志的過濾和導出的設置
  • 檢查不同場景下經過過濾之后的日志信息
  • 記錄日志

記錄日志其實就是簡簡單單的調用如下的方法:

  • [[Yii::trace()]]: 記錄關于某段代碼運行的相關消息。主要是用于開發環境。
  • [[Yii::info()]]: 在某些位置記錄一些比較有用的信息的時候使用。
  • [[Yii::warning()]]: 當某些期望之外的事情發生的時候,使用該方法。
  • [[Yii::error()]]: 當某些需要立馬解決的致命問題發生的時候,調用此方法記錄相關信息。

上面的這些方法雖然根據不同的level和類型來記錄信息,但是實際上它們調用的是同一個方法function($message, $category = 'application')。其中$message就是要記錄的信息,$category表示的是這個日志的歸屬類。下面的代碼表示在默認的‘application'分類下面記錄了一條trace類型的信息。

 Yii::trace('start calculating average revenue');

提示:記錄的$message可以是簡單的string也可以是復雜的數組、對象。你應該根據不同的場景下日志記錄的職責選取合適的$message類型。默認情況下,如果你記錄的$message不是String,日志在導出的時候都會調用[[yii/helpers/VarDumper::export()]] 方法來輸出一個string類型的消息。

為了更好的組織管理及篩選日志消息,通常情況下應當為每一種日志分配合適的類別。你可以選擇一種有明顯等級區分意思的分類,用以方便根據不同的目的來篩選不同分類的日志。一種簡單且有效的命名方式就是使用PHP的魔術常量METHOD來作為分類的名稱。Yii框架里面的核心代碼在做日志記錄的時候就是這么干的。比如說:

Yii::trace('start calculating average revenue', __METHOD__);

在有常量METHOD出現的地方,它表示的就是當前的方法的名稱(并且加上了當前方法所屬的類的完整前綴)。舉個例子吧,如果在app/controllers/RevenueController這個類里面的calculate方法里面有上面的那行代碼,那么此時的METHOD表示的就是‘app/controllers/RevenueController::calculate'。

提示:上面所說的方法事實上只是單例對象[[yii/log/Logger|logger object]] 的[[yii/log/Logger::log()|log()]]方法的簡單使用,我們可以通過Yii::getLogger()方法來獲得這個單例對象。當我們記錄了足夠的日志信息或者當前的應用運行結束了,日志對象將調用[yii/log/Dispatcher|message dispatcher]] 方法把記錄的日志信息寫入到配置的目的位置。

log targets
一個log target是[[yii/log/Target]]或者其子類的實例。它根據嚴重的等級和分類類過濾日志,然后把日志導出到合適的媒介上面去。就比如說,一個[[yii/log/DbTarget|database target]] 對象就會把過濾之后的日志信息導出到對應數據庫。
你可以在應用的配置文件中的日志組件處注冊多個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中配置,這樣才能把日志信息分發到對應的log target.
上面的代碼里面,兩個log target注冊到了[[yii/log/Dispatcher::targets]]里面。

第一個篩選出錯誤和警告信息并且把這些信息保存到了數據庫。
第二個篩選出分類以yii/db*開頭的錯誤信息,并把這些信息通過郵件發送到admin@example.com 和 developer@example.com.
Yii有下面這些內置的log targets,你可以參考API文檔來學習具體怎么去配置和使用它們。

  • [[yii/log/DbTarget]]:把日志信息保存到數據庫。
  • [[yii/log/EmailTarget]]: 把日志信息發送到指定的郵箱,上面的例子就是。
  • [[yii/log/FileTarget]]: 把日志寫到到文件。
  • [[yii/log/SyslogTarget]]: 調用PHP的syslog()方法將日志寫入到系統日志。

接下來,我們就來看看常見的log target具有的功能。

消息過濾
就每一種log target而言,你可以配置它的 [[yii/log/Target::levels|levels]] 和 [[yii/log/Target::categories|categories]]屬性類設置它的嚴重程度以及歸屬的分類。
[[yii/log/Target::levels|levels]]屬性的采用一個數組里面的一個或者多個值,這個數組包含如下值:

  • error:對應[[Yii::error()]]記錄的消息
  • warning:對應[[Yii::warning()]]記錄的消息
  • info :對應 [[Yii::info()]]記錄的信息
  • trace:對應 [[Yii::trace()]]記錄的信息.
  • profile :對應[[Yii::beginProfile()]] 和 [[Yii::endProfile()]]記錄的信息,這種方式下面更多詳細信息會被記錄。

如果你沒有指定[[yii/log/Target::levels|levels]] 的值,那么任何level的信息都會被記錄。

[[yii/log/Target::categories|categories]] 屬性的值是數組,這個數組里面的值可以是一個具體的分類名稱,也可以是類似正則的匹配模式。只有在target能在這個數組里面找到對應的分類名或者符合某一個匹配模式,他才會處理這些消息。這里的匹配模式的組成是在分類的名稱后面加上一個號。如果這個分類恰好和這個匹配模式的號前的字符匹配,那么也就是這個分類找到對應匹配值。舉個例來說,在類[[yii/db/Command]]中的yii/db/Command::execute和yii /db/Command:: query 方法使用類名類記錄相關日志信息,那么這個時候他們都匹配模式yii/db*

同樣的,如果我們沒有指定[[yii/log/Target::categories|categories]],那么每一種分類的日志信息都會被處理。
除了通過[[yii/log/Target::categories|categories]] 屬性來設置分類的白名單外,你也可以通過 [[yii/log/Target::except|except]]屬性來設置分類的黑名單。屬于黑名單的分類日志信息不會被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',],]
注意:當錯誤的句柄捕獲到HTTP的異常的時候,記錄的日志信息會以yii/web/HttpException:ErrorCode的這種格式
記錄,例如[[yii/web/NotFoundHttpException]] 就會被記錄成yii/web/HttpException:404
消息格式化
日志targets用多種格式來導出日志。舉個例子,如果你的日志target是[[yii/log/FileTarget]],那么你在你的程序中記錄日志的時候,應該會找到類似于文件runtime/log/app.log 記錄的如下的信息:
2014-10-04 18:10:15 [::1][][-][trace][yii/base/Module::getModule] Loading module: debug

默認情況下,[[yii/log/Target::formatMessage()]]:會幫我們把日志信息格式化成下面的這種格式:

Timestamp [IP address][User ID][Session ID][Severity Level][Category] Message Text

你可以通過給[[yii/log/Target::prefix]] 屬性配置一個自定義的回調函數來 自定義日志的前綴。下面的代碼就實現了在每條日志信息前面加上了用戶的ID(ip地址,sessionId等敏感信息因為個人隱私被去掉了)。

['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還把一些上下文信息附加在了每一批的日志記錄中。默認情況下,全局的PHP變量包含$_GET, $_POST, $_FILES, $_COOKIE, $_SESSION 和 $_SERVER. 你可以通過配置 [[yii/log/Target::logVars]] 來調整日志記錄的全局變量。下面的代碼表示的是只記錄$_SERVER相關的變量。

['class' => 'yii/log/FileTarget','logVars' => ['_SERVER'],]

當 'logVars'為空的時候,表示不記錄相關的上下文信息。如果你想自定義上下文信息的提供方式,你可以覆寫[[yii/log/Target::getContextMessage()]] 方法。

消息的trace等級
在開發的過程當中,我們總是期望能夠知道每一條日志消息是來自哪里。在Yii中你可以通過配置[[yii/log/Dispatcher::traceLevel|traceLevel]] 屬性來實現。配置的示例如下:

return ['bootstrap' => ['log'],'components' => [  'log' => [    'traceLevel' => YII_DEBUG ? 3 : 0,    'targets' => [...],  ],],];

上面的示例在YII_DEBUG為true的時候將[[yii/log/Dispatcher::traceLevel|traceLevel]] 設置為3,反之設置為0. 意思是什么呢?3表示每一條日志記錄都會記錄與之相關的三層棧調用信息,0表示不記錄任何相關的棧調用信息

提示:沒有必要總是記錄調用的堆棧信息,比較耗性能。所以,你應該只在你開發的時候或者用于調試的情況下使用該功能。
消息的清空和導出
就如同上面說的,記錄的消息以數組的形式保存在[[yii/log/Logger|logger object]]中。為了限制這個數組消耗過多的內存,當這個數組包含的內容大小達到某個量的時候會被對應的target從內存中轉移到對應的目標(文件,數據庫...)中。你可以通過設置 [[yii/log/Dispatcher::flushInterval|flushInterval]] 的值來決定量的大小。像下面這樣:

return ['bootstrap' => ['log'],'components' => [  'log' => [    'flushInterval' => 100,  // default is 1000    'targets' => [...],  ],],];

注意:在應用運行結束的時候也會刷新內存,這樣做事為了讓日志的target能夠記錄完整的信息。
把日志信息從內存刷到對應存放的地方的這一動作不是立即發生的。事實上,和上面一樣,都是當內存中的日志大小達到一定程度才會發生。你可以像下面的示例一樣通過配置不同target的[[yii/log/Target::exportInterval|exportInterval]]值,來達到修改的目的:

['class' => 'yii/log/FileTarget','exportInterval' => 100, // default is 1000]

因為清空和導出的設定,默認情況下你調用 Yii::trace() 或者其他的日志記錄方法的時候不會在日志target下立馬看到日志消息。這對某些長時間運行的控制臺程序是一個問題。不過這個問題是可以解決的,方法入下面的代碼,你需要把[[yii/log/Dispatcher::flushInterval|flushInterval]] 和[[yii/log/Target::exportInterval|exportInterval]] 的值都設置成1:

return ['bootstrap' => ['log'],'components' => [  'log' => [    'flushInterval' => 1,    'targets' => [      [        'class' => 'yii/log/FileTarget',        'exportInterval' => 1,      ],    ],  ],],];

注意:如此頻繁的清空和導出日志消息會降低系統的性能。
切換日志的targets
你可以通過設置[[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',      ],    ],  ],],];

創建一個新的target
首先,創建一個新的日志target是很簡單的。你主要做的事情是實現[[yii/log/Target::export()]] 方法并且把數組類型的消息[[yii/log/Target::messages]]發送到指定的存儲媒介上去就行了。在這個過程中你可以調用[[yii/log/Target::formatMessage()]] 方法來格式化每一條日志消息。至于更多的細節你可以在Yiid的發行版本里找到詳細的信息。

性能評測
性能評測是一種比較特別的日志記錄。它通常用來獲取某些模塊執行時間的數據,以此來找到性能的問題所在。比如說,[[yii/db/Command]] 這個類就用性能評測日志來獲得每一條sql查詢所花費的時間。

要使用該類日志,你首先要做的時確定你要測試的代碼范圍。然后在每一段代碼之間你都應該要保持它們是閉合的,就像下面這個樣子:

/Yii::beginProfile('myBenchmark');...code block being profiled.../Yii::endProfile('myBenchmark');

myBenchmark只是一個標識,用于你在查看對應日志記錄的時候快速定位。
在beginProfile和endProfile之間是可以再嵌套的,但是必須保證正確的閉合關系,如下所示:

/Yii::beginProfile('block1');// some code to be profiled/Yii::beginProfile('block2');  // some other code to be profiled/Yii::endProfile('block2');/Yii::endProfile('block1');

如果上面的閉合關系出錯了,對應的記錄都不會正常工作。

對于每一塊被評測的代碼,日志的level都是profile。你可以再日志的target中配置這些信息并導出它們。 Yii內建了 Yii debugger來展示評測的結果。



注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲香蕉在线观看| 亚洲国产成人一区| 欧美中文在线观看国产| 亚洲精品久久久一区二区三区| 青草热久免费精品视频| 久久久久久久久网站| 成人性生交大片免费看视频直播| 日韩欧美中文第一页| 成人免费在线网址| 中文日韩电影网站| 国产精品免费在线免费| 日韩专区中文字幕| 久久成人亚洲精品| 一区二区三区高清国产| 欧美黑人性视频| 亚洲欧美中文在线视频| 国产精品一区电影| 欧美wwwxxxx| 亚洲成av人片在线观看香蕉| 青青久久av北条麻妃海外网| 欧美怡红院视频一区二区三区| 2019亚洲日韩新视频| 青青久久av北条麻妃海外网| 91国产美女在线观看| 在线观看国产精品91| 亚洲国产美女精品久久久久∴| 在线视频中文亚洲| 91亚洲国产精品| 欧美电影免费观看大全| 国产日韩精品在线| 亚洲系列中文字幕| 欧美激情精品久久久久久久变态| 久久影院资源网| 国产精品第8页| 欧美人在线视频| 欧美激情中文网| 亚洲国内精品视频| 日韩av中文字幕在线免费观看| 色综合久综合久久综合久鬼88| 久久精品99久久久香蕉| 三级精品视频久久久久| 日韩成人av网| 欧美精品videosex极品1| 国产精品永久免费| 国产精品网红福利| 91热精品视频| 亚洲欧美激情另类校园| 午夜精品久久久久久99热软件| 亚洲综合中文字幕在线| 国产97在线播放| 亚洲天堂av在线免费观看| 一个人www欧美| 国产精品成人播放| 久久精品国产亚洲7777| 欧美激情视频在线免费观看 欧美视频免费一| 91美女福利视频高清| 日韩视频在线免费观看| 久久影视免费观看| 日韩视频中文字幕| 久久九九免费视频| 国产精品777| 久久精品国产91精品亚洲| 亚洲欧美日韩中文在线| 国产精品成人观看视频国产奇米| 色悠悠国产精品| 国产丝袜精品视频| 91精品国产综合久久久久久蜜臀| 欧美激情国产精品| 91精品久久久久| 色综合老司机第九色激情| 欧美激情女人20p| 久久久久久12| 777午夜精品福利在线观看| 日韩免费av片在线观看| 欧美放荡办公室videos4k| 亚洲男子天堂网| 日韩动漫免费观看电视剧高清| 日韩网站免费观看| 国产欧美一区二区三区在线| 亚洲天堂视频在线观看| 欧美日韩美女在线观看| 亚洲色图18p| 久久国产精彩视频| 欧美午夜精品久久久久久浪潮| 国产一区二区成人| 日韩精品小视频| 亚洲精品wwwww| 亚州成人av在线| 国内揄拍国内精品少妇国语| 国产免费一区二区三区香蕉精| xvideos亚洲| 欧美激情视频一区二区三区不卡| 欧美—级a级欧美特级ar全黄| 日韩一区二区精品视频| 久久91精品国产| 啊v视频在线一区二区三区| 亚洲欧美精品伊人久久| 国产91色在线免费| 91丝袜美腿美女视频网站| 欧美激情一区二区三区久久久| 热草久综合在线| 久久中文字幕国产| 日韩欧美在线免费| 日韩av不卡在线| 日韩中文字幕在线看| 色综合91久久精品中文字幕| 久久香蕉频线观| 亚洲国产精品资源| 欧美性资源免费| 中文字幕在线亚洲| 日韩精品在线观看视频| **欧美日韩vr在线| 91精品国产91久久久久福利| 在线视频欧美日韩精品| 欧美大片网站在线观看| 亚洲精品国产免费| 97视频在线观看免费| 91精品国产色综合| 国产精品极品美女粉嫩高清在线| 在线电影av不卡网址| 中文字幕国产亚洲2019| 亚洲国产免费av| 日av在线播放中文不卡| 国产精品黄页免费高清在线观看| 色777狠狠综合秋免鲁丝| 欧美在线播放视频| 欧美激情精品在线| 日韩电视剧免费观看网站| 懂色av中文一区二区三区天美| 欧美成人午夜激情| 亚洲国产高清福利视频| 亚洲欧洲一区二区三区在线观看| 午夜精品久久久久久久99黑人| 欧美大片第1页| 欧美专区第一页| 45www国产精品网站| 欧美寡妇偷汉性猛交| 好吊成人免视频| 欧美最顶级丰满的aⅴ艳星| 欧美在线精品免播放器视频| 国产日韩中文在线| 国模精品视频一区二区三区| 久久资源免费视频| 欧美激情一二区| 国产精品女人久久久久久| 久久精品小视频| 久久不射电影网| 国产精品久久久久久久美男| 一级做a爰片久久毛片美女图片| 97人人爽人人喊人人模波多| 欧美床上激情在线观看| 久久久综合免费视频| 亚洲美女性生活视频| 成人免费看吃奶视频网站| 亚洲国产精品久久久久秋霞不卡| 亚洲精品免费网站| 亚洲一区二区福利| 成人精品久久av网站| 久久久久久久久久久av| 91免费版网站入口| 欧美在线观看日本一区| 亚洲性线免费观看视频成熟| 精品久久久久久电影| 黑人巨大精品欧美一区二区一视频|