啥樣的后端程序員是好程序員?能機器做的事絕不自己做伍纫,哈哈宗雇。
場景復現(xiàn)
- 客戶端:后端接口報錯了,我解析數(shù)據(jù)失敗莹规,你看看為啥赔蒲?
- 服務端:好,我查查log良漱。你把請求參數(shù)給我打印出來舞虱。
- 客戶端:我咋打印母市?
- 服務端:....我還是自己查log吧
image.png
以上這種場景在開發(fā)中是不是時有發(fā)生矾兜?是不是很難頂?有啥好辦法讓debug更智能一點嗎患久?
分析
- 不管哪個語言做服務端開發(fā)椅寺,一定有異常處理和日志。
- 找到一個三方平臺蒋失,當捕獲到異撤蹬粒或者有新的打印日志時回調,推送錯誤日志給我們篙挽。
- 經過一番調研之后荆萤,發(fā)現(xiàn)釘釘?shù)臋C器人是個好工作
說干就干,刷文檔铣卡,寫實現(xiàn)观腊。
后端實現(xiàn)以PHP的Laravel為例邑闲,其他語言也可以借鑒思路。
image.png
修改日志配置
<?php
use Monolog\Handler\NullHandler;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\SyslogUdpHandler;
return [
'default' => env('LOG_CHANNEL', 'stack'),
'channels' => [
'stack' => [
'driver' => 'stack',
//測試環(huán)境除了使用daily保存每天日志到logs/laravel.log梧油,還使用’dingding‘channel
'channels' => env("APP_ENV") == 'test' ? ['daily', 'dingding'] : ['daily'],
'ignore_exceptions' => false,
],
//配置釘釘 驅動選擇 monolog
'dingding' => [
'driver' => 'monolog',
'level' => 'error',
'handler' => \App\Handler\DingdingLogHandler::class, //自定義handler
],
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
'days' => 14,
],
.
.
.
],
];
上面不重要的代碼使用3個豎向排列的.省略顯示。
自定義Handler
<?php
namespace App\Handler;
use App\Library\CurlRequest;
use App\Library\Utility;
use Monolog\Logger;
use Monolog\Handler;
class DingdingLogHandler extends Handler\AbstractProcessingHandler
{
private $apiKey;
private $channel;
public function __construct(
$level = Logger::DEBUG,
bool $bubble = true
) {
parent::__construct($level, $bubble);
}
protected function write(array $record): void
{
$this->send($record['formatted']);
}
protected function send(string $message): void
{
$microSecond = Utility::getMicroSecond();
$key = "xxxx";
$hashString = hash_hmac("sha256", $microSecond ."\n" . $key, $key, true);
$sign = urlencode(base64_encode($hashString));
CurlRequest::post("https://oapi.dingtalk.com/robot/send?access_token=xxxxx×tamp=".$microSecond."&sign=".$sign,
[
"msgtype" => "text",
"at" => [
"atMobiles" => [
"xxxx",
"xxxx"
]
],
"text" => [
"content" => $message
]
]);
}
}
部署上線的效果
image.png
再也不用爬日志啦州邢!
測試妹子再找我說客戶端報錯數(shù)據(jù)解析錯誤儡陨,我也能馬上硬氣的回答:”應該是客戶端解析問題,服務端沒收到報錯量淌∑澹“
此處放一個機智的表情
image.png
參考文檔
- 日志相關參考文檔 laravel中文文檔 日志篇
- 釘釘相關參考文檔 釘釘機器人文檔
歡迎大家評論、點贊呀枢、關注