關(guān)于Thinkphp6的日志問題
Thinkphp6的日志問題
日志級別
debug, info, notice, warning, error, critical, alert, emergency
其中有一個特別的級別:sql,專門用來記錄sql語句的
設(shè)置日志記錄級別
對于程序比較重要的業(yè)務(wù)模塊可以進(jìn)行埋點(diǎn)(進(jìn)行日志記錄)
可以通過設(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
獨(dú)立日志
每一種日志級別的日志都?xì)w類到一個文件之中(推薦開啟獨(dú)立日志)
設(shè)置 config/log.php 中通道apart_level屬性
? ? ? ? # ?設(shè)置 file 通道 info,notice,warning 級別開啟獨(dú)立日志 ? ? ? ? # ?channels.file.apart_level ? ? ? ? # 'apart_level' => ['info', 'notice', 'warning'] ? ? ? ? # 在 apart_level中的級別會獨(dú)立寫到一個文件中去 ? ? ? ? # 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");
日志的寫入時機(jī)
日志寫入時機(jī)提供兩種(實時寫入,程序執(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 ? ? ? ? ? { ? ? ? ? ? # 這里進(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)置已了一個app\ExceptionHandle異常處理類可供使用
該類綁定在app目錄下面的provider.php文件中,直接修改該類的相關(guān)方法即可完成應(yīng)用的自定義異常處理機(jī)制。
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 非強(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級別和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)一進(jìn)行日志信息寫入
關(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)文章
thinkPHP2.1自定義標(biāo)簽庫的導(dǎo)入方法詳解
這篇文章主要介紹了thinkPHP2.1自定義標(biāo)簽庫的導(dǎo)入方法,詳細(xì)分析了thinkPHP標(biāo)簽庫的定義、使用及自動導(dǎo)入相關(guān)技巧,需要的朋友可以參考下2016-07-07CI框架(CodeIgniter)實現(xiàn)的數(shù)據(jù)庫增刪改查操作總結(jié)
這篇文章主要介紹了CI框架(CodeIgniter)實現(xiàn)的數(shù)據(jù)庫增刪改查操作,結(jié)合實例形式總結(jié)分析了CI框架針對mysql數(shù)據(jù)庫增刪改查操作的模型、控制器及視圖相關(guān)定義與使用技巧,需要的朋友可以參考下2018-05-05