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

app\ExceptionHandle.php 異常處理類,重新定義render方法即可
#app\ExceptionHandle.php
public function render($request, Throwable $e): Response
{
// app_debug模式下按原thinkphp6異常模式處理異常
if (env('app_debug')) {
return parent::render($request, $e);
}
// 自定義json返回錯誤
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ù)器錯誤']);
}
目標(biāo):訪問未定義的路由時返回json格式的信息 # url_route_must:false 非強制路由模式下
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級別和sql執(zhí)行語句日志
- 非DEBUG模式默認(rèn)僅記錄error級別日志
- DEBUG模式在根目錄增加.env文件 設(shè)置APP_DEBUG = false/true

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

