關(guān)于Thinkphp6的日志問(wèn)題
Thinkphp6的日志問(wèn)題
日志級(jí)別
debug, info, notice, warning, error, critical, alert, emergency
其中有一個(gè)特別的級(jí)別:sql,專(zhuān)門(mén)用來(lái)記錄sql語(yǔ)句的
設(shè)置日志記錄級(jí)別
對(duì)于程序比較重要的業(yè)務(wù)模塊可以進(jìn)行埋點(diǎn)(進(jìn)行日志記錄)
可以通過(guò)設(shè)置日志記錄級(jí)別來(lái)開(kāi)啟和關(guān)閉記錄
有助于排除錯(cuò)誤(比每次出現(xiàn)錯(cuò)誤去代碼里增加記錄日志好多了)
? ? ? ? # 修改 config/log.php
? ? ? ? # 配置 'level' => ['notice','warning']
? ? ? ? # level 不為空時(shí),只記錄level中指定的錯(cuò)誤級(jí)別
? ? ? ? # level 為空時(shí),記錄所有級(jí)別
? ? ? ? $user = UserService::getInstance()->findByUsername('xieruixiang');
? ? ? ? Log::warning("warning:{user}", compact('user'));
? ? ? ? # info 不再 level 中 則不會(huì)記錄
? ? ? ? Log::info("I'm info");單一日志
默認(rèn)的tp日志是寫(xiě)在當(dāng)前日期(年月)目錄下的,如(runtime/admin/log/202204/30_info.log)
單一日志設(shè)置 修改config/log.php 中通道single屬性為true
設(shè)置單一日志后,將不再寫(xiě)在時(shí)間目錄下(一直寫(xiě)一個(gè)固定目錄),如(runtime/admin/log/single_info.log)
# 開(kāi)啟單一日志 # channels.file.single # 這里給file通道開(kāi)啟單一日志 'single' => true
獨(dú)立日志
每一種日志級(jí)別的日志都?xì)w類(lèi)到一個(gè)文件之中(推薦開(kāi)啟獨(dú)立日志)
設(shè)置 config/log.php 中通道apart_level屬性
? ? ? ? # ?設(shè)置 file 通道 info,notice,warning 級(jí)別開(kāi)啟獨(dú)立日志
? ? ? ? # ?channels.file.apart_level
? ? ? ? # 'apart_level' => ['info', 'notice', 'warning']
? ? ? ? # 在 apart_level中的級(jí)別會(huì)獨(dú)立寫(xiě)到一個(gè)文件中去
? ? ? ? # write to runtime/admin/log/202204/30_warning.log
? ? ? ? Log::warning("I'm ");
? ? ? ? # write to runtime/admin/log/202204/30_info.log
? ? ? ? Log::info("I'm info");
? ? ? ? # write to runtime/admin/log/202204/30_notice.log
? ? ? ? Log::notice("I'm notice");日志的寫(xiě)入時(shí)機(jī)
日志寫(xiě)入時(shí)機(jī)提供兩種(實(shí)時(shí)寫(xiě)入,程序執(zhí)行完后寫(xiě)入)
通過(guò)設(shè)置config/log.php中通道 realtime_write 屬性
? ? ? ? # 這里中斷程序的執(zhí)行
? ? ? ? # 如果 realtime_write = false 則無(wú)法寫(xiě)到日志中去
? ? ? ? # realtime_write = true 可以寫(xiě)入日志中去
? ? ? ? Log::warning("I'm ");
? ? ? ? # 如果 realtime_write = false
? ? ? ? # 又想實(shí)時(shí)寫(xiě)入
? ? ? ? # 可以通過(guò) Log::write($msg, $type) 實(shí)時(shí)寫(xiě)入
? ? ? ? # $msg 信息
? ? ? ? # $type 日志級(jí)別
? ? ? ? Log::write("I'm write", 'warning');
? ? ? ? die("日志將不會(huì)寫(xiě)入");
日志通道
可以自定義通道
以增加郵件通道為例
將config/log.php 中通道type 改成自定義驅(qū)動(dòng)類(lèi)即可
? ? ? ? # config/log.php channels 添加
? ? ? ? ?'email' => [
? ? ? ? ? ? 'type' => \app\admin\driver\EmailDriver::class,
? ? ? ? ? ? # 調(diào)試發(fā)送郵件時(shí)將其設(shè)置成實(shí)時(shí)比較好調(diào)試
? ? ? ? ? ? 'realtime_write' => true,
? ? ? ? ]
? ? ? ??
? ? ? ?# EmailDriver 需要實(shí)現(xiàn) think\contract\LogHandlerInterface
? ? ? ?class EmailDriver implements LogHandlerInterface
? ? ? ?{
? ? ? ? ? public function save(array $log): bool
? ? ? ? ? {
? ? ? ? ? # 這里進(jìn)行發(fā)送郵件邏輯
? ? ? ? ? # 想知道郵件發(fā)送邏輯的可以參考我的文章 《php發(fā)送郵件》
? ? ? ? ? # 不想知道的 可以調(diào)用第三方封裝好的php發(fā)送郵件組件
? ? ? ? ? ?return true;
? ? ? ? ? }
? ? ? ?}使用郵件通道
?# channel($channelName) 指定發(fā)送通道
?# 不指定則使用默認(rèn)發(fā)送通道
?# config/log.php
?# 'default' => env('log.channel', 'file'),
?Log::channel('email')->info("this is info");
?# 就能以郵件形式通知了Thinkphp6異常處理與日志
異常處理
目標(biāo):返回json格式的異常信息 # url_route_must:true強(qiáng)制路由模式下
thinkphp6內(nèi)置已了一個(gè)app\ExceptionHandle異常處理類(lèi)可供使用
該類(lèi)綁定在app目錄下面的provider.php文件中,直接修改該類(lèi)的相關(guān)方法即可完成應(yīng)用的自定義異常處理機(jī)制。

app\ExceptionHandle.php 異常處理類(lèi),重新定義render方法即可
#app\ExceptionHandle.php
public function render($request, Throwable $e): Response
{
// app_debug模式下按原thinkphp6異常模式處理異常
if (env('app_debug')) {
return parent::render($request, $e);
}
// 自定義json返回錯(cuò)誤
if ($e instanceof ValidateException) {
return json($e->getError(), 422);
return json(['code' => 0, 'msg' => $e->getError()], 422);
}
// 自定義json返回異常
if ($e instanceof HttpException && $request->isAjax()) {
return json(['code' => 0, 'msg' => $e->getMessage()], $e->getStatusCode());
}
// 自定義json返回異常
if ($e instanceof HttpException) {
return json(['code' => 0, 'msg' => $e->getMessage()]);
}
// 自定義json返回異常
return json(['code' => 0, 'msg' => 'Biny服務(wù)器錯(cuò)誤']);
}
目標(biāo):訪問(wèn)未定義的路由時(shí)返回json格式的信息 # url_route_must:false 非強(qiáng)制路由模式下
php think make:controller Error --plain
public function index()
{
return json([
'code' => 0,
'data' => 'Route is Not Found',
'msg' => 'success'
]);
}
public function __call($name, $arguments)
{
return json([
'code' => 0,
'data' => 'Route is Not Found',
'msg' => 'success'
]);
}
日志
- DEBUG模式下默認(rèn)記錄error級(jí)別和sql執(zhí)行語(yǔ)句日志
- 非DEBUG模式默認(rèn)僅記錄error級(jí)別日志
- DEBUG模式在根目錄增加.env文件 設(shè)置APP_DEBUG = false/true

手動(dòng)記錄日志
| 方法 | 描述 |
|---|---|
| record() | Log::record(‘record方法記錄的日志信息不是實(shí)時(shí)保存的’,‘info’); |
| write() | Log::write(‘要實(shí)時(shí)記錄的話,可以采用write方法’,‘info’); |
系統(tǒng)在請(qǐng)求結(jié)束后會(huì)自動(dòng)調(diào)用Log::save方法統(tǒng)一進(jìn)行日志信息寫(xiě)入
關(guān)閉日志
Log::close(); //手動(dòng)關(guān)閉本次請(qǐng)求的日志寫(xiě)入
更多日志配置于app\config\log.php文件中配置,參考官方文檔配置即可
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- thinkphp6如何使用中間件記錄行為日志
- Thinkphp6.0中間件的具體使用
- ThinkPHP6.0前置、后置中間件區(qū)別
- thinkphp6使用mysql悲觀鎖解決商品超賣(mài)問(wèn)題的實(shí)現(xiàn)
- phpstorm遠(yuǎn)程連接服務(wù)器并實(shí)時(shí)更新發(fā)布代碼(thinkphp6.0.7)
- ThinkPHP6.0 重寫(xiě)URL去掉Index.php的解決方法
- ThinkPHP6通過(guò)Ucenter實(shí)現(xiàn)注冊(cè)登錄的示例代碼
- ThinkPHP6.0如何利用自定義驗(yàn)證規(guī)則規(guī)范的實(shí)現(xiàn)登陸
- 讓whoops幫我們告別ThinkPHP6的異常頁(yè)面
- 基于thinkphp6.0的success、error實(shí)現(xiàn)方法
- 使用composer安裝使用thinkphp6.0框架問(wèn)題【視頻教程】
- 寶塔中ThinkPHP框架使用Redis的一系列教程
- thinkphp6中Redis 的基本使用方法詳解
相關(guān)文章
Yii2框架操作數(shù)據(jù)庫(kù)的方法分析【以mysql為例】
這篇文章主要介紹了Yii2框架操作數(shù)據(jù)庫(kù)的方法,結(jié)合實(shí)例形式分析了Yii2框架配置、連接mysql數(shù)據(jù)庫(kù)及執(zhí)行SQL進(jìn)行增刪改查等相關(guān)操作技巧,需要的朋友可以參考下2019-05-05
ThinkPHP中的create方法與自動(dòng)令牌驗(yàn)證實(shí)例教程
這篇文章主要介紹了ThinkPHP中的create方法與自動(dòng)令牌驗(yàn)證的實(shí)現(xiàn)方法,有著非常重要的用途,需要的朋友可以參考下2014-08-08
從零開(kāi)始學(xué)YII2框架(二)通過(guò) Composer 安裝擴(kuò)展插件
在使用Yii框架開(kāi)發(fā)的過(guò)程中,有一些優(yōu)秀的插件可以讓我們事半功倍。下面來(lái)介紹通過(guò)Composer安裝Yii2插件的方法。2014-08-08
thinkPHP框架實(shí)現(xiàn)類(lèi)似java過(guò)濾器的簡(jiǎn)單方法示例
這篇文章主要介紹了thinkPHP框架實(shí)現(xiàn)類(lèi)似java過(guò)濾器的簡(jiǎn)單方法,結(jié)合實(shí)例形式分析了thinkPHP基于繼承實(shí)現(xiàn)的登錄驗(yàn)證功能相關(guān)操作方法,需要的朋友可以參考下2018-09-09
微信企業(yè)轉(zhuǎn)賬之入口類(lèi)分裝php代碼
這篇文章主要為大家詳細(xì)介紹了微信企業(yè)轉(zhuǎn)賬之入口類(lèi)分裝php代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10
PHP設(shè)計(jì)模式(三)建造者模式Builder實(shí)例詳解【創(chuàng)建型】
這篇文章主要介紹了PHP設(shè)計(jì)模式:建造者模式Builder,結(jié)合實(shí)例形式詳解分析了PHP建造者模式Builder相關(guān)概念、功能、原理、實(shí)現(xiàn)技巧與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2020-05-05
IOS蘋(píng)果AppStore內(nèi)購(gòu)付款的服務(wù)器端php驗(yàn)證方法(使用thinkphp)
這篇文章主要介紹了IOS蘋(píng)果AppStore內(nèi)購(gòu)付款的服務(wù)器端php驗(yàn)證方法(使用thinkphp),需要的朋友可以參考下2022-12-12
純php打造的tab選項(xiàng)卡效果代碼(不用js)
用php實(shí)現(xiàn)的tab選項(xiàng)卡效果,根據(jù)get判斷,獲取get生成css與對(duì)應(yīng)的內(nèi)容,當(dāng)然效率肯定沒(méi)有靜態(tài)的好,這里給出的思路與方法。2010-12-12

