[TOC]
# 基本使用
**@runtime/logs**目錄就是日志目錄
要產生日志就需要配置`log`組件,簡單的配置示例如下:
~~~php
'log' => [
'targets' => [
[
'class' => 'yii\log\FileTarget', //日志處理器的類
'levels' => ['error', 'warning'], //要記錄的級別
'logFile' => '@runtime/logs/app.log', //日志文件名
],
],
]
~~~
其中logFile是@runtime開頭,底層會拿去做別名解析,所以會得到一個完整路徑
添加以上組件配置后還要給app的bootstrap至少配置`['log']`這個值(不懂的菜鳥請參考[了解組件 - 預啟動組件](http://www.kkh86.com/it/yii2/guide-base-component.html#mbootstrap))
接下來在控制器里試著執行`Yii::error('錯誤日志消息')`這個代碼,然后就能在@runtime/logs目錄看到日志文件了,打開一看就懂里面的內容,我就不介紹先了
# 日志級別
## 級別的介紹
日志有級別的區分,其實主要跟PHP的錯誤級別對應吧,日志組件并不是所有級別的都會收集的,**需要在配置里聲明要收集的級別**
怎么聲明呢,很簡單,就像上面的配置一樣,在`levels`里聲明,常見的level有4個,分別是:
1. `debug`:調試級別
2. `info`:消息級別
3. `warning`:警告級別
4. `error`:調錯誤級別
而上面例子中的配置就是只收集了warning和error兩個級別而已
## 記錄日志的快捷方法
Yii要實現寫日志的手段挺多的,但它也提供了4個快捷方法:
~~~php
Yii::debug('調試信息');
Yii::info('消息日志信息:后臺用戶 admin 于2012-12-12 12:12-12進行了登錄');
Yii::warning('XXX產品庫存小于30,請補倉');
Yii::error('支付接口通訊失敗:相關的通訊數據……');
~~~
顯然這4個方法的名稱就是級別的名稱,參數是一模一樣的,就是要記錄到日志里面的字符串
* * *
## 配置里沒聲明的級別,用了快捷方法也不會記錄
就像上面的例子,如果配置說`'levels' => ['warning', 'error']`說明只要warning和error兩個級別的日志
那如果你在代碼中執行`Yii::info('消息日志~~~')`會發現logs目錄根本不會產生任何日志,除非你在levels加入**info**的級別
* * *
# 日志分類
首先日志劃分了不同級別,然后在不同級別中又可以再進一步進行劃分,這個維度就是`分類`
~~~php
Yii::error('無日志分類的');
//接下來重點
Yii::error('日志消息', 'category111');
Yii::error('日志消息', 'category222');
~~~
就這樣,快捷日志方法里傳入的第2個字符串參數就是日志分類的名稱了,也意味著日志分類是自定義的,得到的日志內容是這樣顯示的:

紅框所示的地方就是日志分類的名稱了,其實默認的分類名稱就叫**application**
* * *
## 日志分類過濾
關于日志分類有毛用呢?乍看之下也就只是在日志文件里多了個不同的標識吧?
其實日志分類也能參與到日志收集規則里的,可以定義要收集的日志分類:
~~~php
'log' => [
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
'categories' => ['category111', 'application'], //這里定義收集的分類
'logFile' => '@runtime/logs/app.log',
],
],
]
~~~
定義分類后之前的代碼中**category222**這個分類是不會被記錄到日志里的

# 日志處理器
我們可以在log組件的`targets`中定義多個日志處理器:
~~~php
'log' => [
'targets' => [
[
//處理器1,用于收集錯誤級別的日志
'class' => 'yii\log\FileTarget',
'levels' => ['error'],
'logFile' => '@runtime/logs/error.log',
],
[
//處理器2,用于收集警告級別的日志
'class' => 'yii\log\FileTarget',
'levels' => ['warning'],
'logFile' => '@runtime/logs/warning.log',
],
[
//處理器3,用于收集調試級別的日志
'class' => 'yii\log\FileTarget',
'levels' => ['debug'],
'logFile' => '@runtime/logs/debug.log',
],
[
//處理器4,收集執行過的SQL
'class' => 'yii\log\FileTarget',
'levels' => ['info'],
'categories' => [
'yii\db\Command::query', //查詢語句的分類
'yii\db\Command::execute', //增刪改語句的分類
],
'logFile' => '@runtime/logs/sql.log',
],
],
]
~~~
要注意targets是一個**數組**,每一個元素就是一個處理器的配置,實際上最基本的使用就是將不同級別的日志收集到不同的日志文件中
每個處理器都是一個實現了[yii\\log\\Target](http://www.yiichina.com/doc/api/2.0/yii-log-target)的類,比如上面的[yii\\log\\FileTarget](http://www.yiichina.com/doc/api/2.0/yii-log-filetarget)是將日志收集到文件中的
其實處理器還有其它種類,比如[yii\\log\\EmailTarget](http://www.yiichina.com/doc/api/2.0/yii-log-emailtarget)可以實現將日志收集到郵件中并發送給指定的郵箱
則甚至還有DbTarget可以將日志存入數據庫等等,本節不對這些進行介紹
如果要自定義日志處理器請看我的Yii經驗分享文章《[自定義日志處理器](http://www.kkh86.com/it/yii2-adv/guide-base-custom-log-target.html)》
- 目錄
- 配置
- 簡介
- 別名
- gii
- 配置項
- 模型
- 簡介
- 增刪改查
- AR和model
- 模型事件
- 場景
- query查詢
- 增刪改
- AR查詢器
- 模型關系定義
- AR模型連表查詢
- fields
- where拼接
- 模塊
- 創建模塊
- 控制器
- 表單
- 跳轉
- 響應
- 驗證器
- Action
- 組件
- url
- 分頁
- 驗證碼
- 緩存
- 文件上傳
- 預啟動組件
- 事件
- 自定義組件
- redis
- 日志
- 行為
- cookie和session
- 基礎知識
- 創建一個類
- 配置一個類
- object基類
- component組件類特性
- phpstorm無法更改php等級
- url地址美化
- 過濾器
- 請求處理
- 請求組件
- 響應組件
- header
- 用戶登錄
- 實現IdentityInterface接口
- 登錄
- 自動檢測登錄
- 獲取用戶信息
- 訪問行為追蹤
- phpstorm+postman斷點調試