ThinkPHP5.0增強了開發調整功能,通過強化\think\Log類的功能實現了在不同的環境下面可以使用相同的方法進行調試和輸出。
## 調試方法
系統提供了統一的調試和寫入方法,例如:
~~~
// 記錄調試信息到內存 系統由 \think\Log::save()方法統一寫入
\think\Log::record('調試信息','日志類型');
// 直接寫入調試信息
\think\Log::write('調試信息','日志類型');
~~~
最主要的方法就是 `\think\Log::record()`,系統也提供了一個快捷操作方法trace:
~~~
trace('調試信息','log');
trace(['aaa','bbb'],'debug');
~~~
> record方法支持各種變量的調試輸出。
使用`Log::record()`或者`trace`方法后,通過設置就可以在下面不同的環境中輸出調試結果。
## 本地文件調試
設置如下:
~~~
'log'=>[
'type'=>'file',
'path'=> LOG_PATH,
]
~~~
會在`LOG_PATH`下面生成調試日志文件。
## 頁面Trace調試
設置如下:
~~~
'response_exit'=>false,
'log'=>[
'type'=>'trace',
'trace_file'=> THINK_PATH.'tpl/page_trace.tpl',
]
~~~
運行后可以看到右下角出現了如下圖示:

點擊圖標后可以看到詳細的頁面Trace信息

可以切換顯示不同的Tab項查看不同類型的日志信息。
> 需要注意的是,如果要使用頁面Trace調試功能,需要設置response_exit為false(否則無法在控制器輸出之后顯示頁面Trace信息)。
## SocketLog調試
ThinkPHP5.0版本開始,整合了SocketLog用于本地和遠程調試。
設置如下:
~~~
'log'=>[
'type' => 'socket',
'host' => 'slog.thinkphp.cn',
//日志強制記錄到配置的client_id
'force_client_ids' => [],
//限制允許讀取日志的client_id
'allow_client_ids' => [],
]
~~~
使用Chrome瀏覽器運行后,打開審查元素->Console,可以看到如下所示:

SocketLog通過websocket將調試日志打印到瀏覽器的console中。你還可以用它來分析開源程序,分析SQL性能,結合taint分析程序漏洞。
### 安裝Chrome插件
SocketLog首先需要安裝chrome插件
Chrome插件安裝頁面: https://chrome.google.com/webstore/detail/socketlog/apkmbfpihjhongonfcgdagliaglghcod (需翻墻)
### 使用方法
* 首先,請在chrome瀏覽器上安裝好插件。
* 安裝服務端`npm install -g socketlog-server`?, 運行命令?`socketlog-server`?即可啟動服務。 將會在本地起一個websocket服務 ,監聽端口是1229 。 如果想服務后臺運行:?`socketlog-server > /dev/null &`?我們提供公用的服務端,需要去申請client_id :?[http://111.202.76.133/](http://111.202.76.133/)
### 參數
* `client_id`: 在chrome瀏覽器中,可以設置插件的`Client_ID` ,**Client_ID**是你任意指定的字符串。?

* 設置`client_id`后能實現以下功能:
* 1,配置`allow_client_ids` 配置項,讓指定的瀏覽器才能獲得日志,這樣就可以把調試代碼帶上線。 普通用戶訪問不會觸發調試,不會發送日志。 開發人員訪問就能看的調試日志, 這樣利于找線上bug。 **Client_ID** 建議設置為姓名拼音加上隨機字符串,這樣如果有員工離職可以將其對應的`client_id`從配置項allow_client_ids中移除。 `client_id`除了姓名拼音,加上隨機字符串的目的,以防別人根據你公司員工姓名猜測出`client_id`,獲取線上的調試日志。
* 設置allow_client_ids示例代碼:
~~~
'allow_client_ids'=>['thinkphp_zfH5NbLn','luofei_DJq0z80H'],
~~~
* 2, 設置`force_client_id`配置項,讓后臺腳本也能輸出日志到chrome。 網站有可能用了隊列,一些業務邏輯通過后臺腳本處理, 如果后臺腳本需要調試,你也可以將日志打印到瀏覽器的console中, 當然后臺腳本不和瀏覽器接觸,不知道當前觸發程序的是哪個瀏覽器,所以我們需要強制將日志打印到指定`client_id`的瀏覽器上面。 我們在后臺腳本中使用SocketLog時設置`force_client_id` 配置項指定要強制輸出瀏覽器的`client_id` 即可。