摘要:在實際項目中,通知我們需要記錄一些日志,方便問題核查。但是日志多了就很容易混亂,請求,響應,執行中的日志無法對應,這時就需要為請求進行標記唯一來進行跟蹤。
在實際項目中,通知我們需要記錄一些日志,方便問題核查。但是日志多了就很容易混亂,請求,響應,執行中的日志無法對應,這時就需要為請求進行標記唯一ID來進行跟蹤。
/** * 記錄請求日志 * * Class ApiLog * @package AppLibraryComponentsElog */ class ApiLog { static $logPath; private static $singleton; /** * 單例 * @return ApiLog */ public static function singleton() { if (false == self::$singleton instanceof ApiLog) { self::$singleton = new static(); } return self::$singleton; } protected function __construct($logPath = "") { if (empty($logPath)) { self::$logPath = ROOT_PATH . "logs/request/"; } else { self::$logPath = ROOT_PATH . $logPath; } if (!is_dir(self::$logPath)) { mkdir(self::$logPath, 0777, true); } } public function record($action, $request = [], $type = "requestLog") { $headers = []; if (!function_exists("getallheaders")) { foreach ($_SERVER as $name => $value) { if (substr($name, 0, 5) == "HTTP_") { $headers[str_replace(" ", "-", strtolower(str_replace("_", " ", substr($name, 5))))] = $value; } } } else { $headers = getallheaders(); } //============== 加密用戶登錄密碼 if (isset($request["password"])) { $request["password"] = md5(md5($request["password"])); } //============== 加密郵箱 if (isset($request["email"])) { $request["email"] = encrypt_email($request["email"]); } // ...... 日志中對關鍵信息進行加密 // 請求日志記錄詳細一點 if ("requestLog" == $type) { $data = [ "action" => $action, "platform" => PHONE_SYSTEM, "ip" => real_ip(), "request" => $request, "REQUEST_URI" => isset($_SERVER["REQUEST_URI"]) ? $_SERVER["REQUEST_URI"] : "", "headers" => $headers, ]; } else { $data = [ "action" => $action, "response" => $request ]; } $this->write($data, $type); } protected function write($logData, $type) { $minutes = date("i"); $file = date("Y-m-d-H") . "-v" . (intval($minutes / 10)) . ".log"; $logData = ["request_id" => static::getRequestId(), "add_time" => time(), "type" => $type, "content" => $logData]; file_put_contents(self::$logPath . $file, json_encode($logData) . PHP_EOL, FILE_APPEND); } protected static function getRequestId() { static $requestId = ""; if (!empty($requestId)) { return $requestId; } if (function_exists("session_create_id")) { $hash = session_create_id(); } else { $uid = uniqid("", true); $data = ""; $data .= isset($_SERVER["REQUEST_TIME"]) ? $_SERVER["REQUEST_TIME"] : ""; $data .= isset($_SERVER["HTTP_USER_AGENT"]) ? $_SERVER["HTTP_USER_AGENT"] : ""; $data .= isset($_SERVER["LOCAL_ADDR"]) ? $_SERVER["LOCAL_ADDR"] : ""; $data .= isset($_SERVER["LOCAL_PORT"]) ? $_SERVER["LOCAL_PORT"] : ""; $data .= isset($_SERVER["REMOTE_ADDR"]) ? $_SERVER["REMOTE_ADDR"] : ""; $data .= isset($_SERVER["REMOTE_PORT"]) ? $_SERVER["REMOTE_PORT"] : ""; $hash = hash("ripemd128", $uid . md5($data)); } $hash = strtoupper($hash); return $requestId = substr($hash, 0, 8) . "-" . substr($hash, 8, 4) . "-" . substr($hash, 12, 4) . "-" . substr($hash, 16, 4) . "-" . substr($hash, 20, 12); } }
使用單例,保證一次請求的ID一致
ApiLog::singleton()->record($action,$request); ApiLog::singleton()->record($action,$actionData,"createOrder"); ApiLog::singleton()->record($action,$errorMessage,"errorHandler"); ApiLog::singleton()->record($action,$response,"ResponseLog");
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/29526.html
摘要:當前線程的子線程會繼承其父線程中的的內容。若希望在線程池與主線程間傳遞,需配合和使用。 一、背景 開發排查系統問題用得最多的手段就是查看系統日志,在分布式環境中一般使用ELK來統一收集日志,但是在并發大時使用日志定位問題還是比較麻煩,由于大量的其他用戶/其他線程的日志也一起輸出穿行其中導致很難篩選出指定請求的全部相關日志,以及下游線程/服務對應的日志。 ? 二、解決思路 每個請求都使...
摘要:只要一個有,那無論用什么設備訪問,都會得到這個還原也是相當簡單把數據庫備份導入到另一臺機器,部署同樣的運行環境與代碼。純粹只是一個狀態管理庫,幾乎可以搭配任何框架使用上述例子連都沒用哦親下一章進階教程 Redux 簡明教程 原文鏈接(保持更新):https://github.com/kenberkele... 寫在前面 本教程深入淺出,配套 簡明教程、進階教程(源碼精讀)以及文檔注釋...
摘要:配置配置使用概率抽樣。采樣率定義了對跟蹤跨度進行采樣的概率,其值可以介于和含之間。例如,以下配置對象將采樣率更改為即每個跨度都被采樣,并使用協議將跟蹤發送到位于的服務器文件路徑注將采樣率更改為會完全禁用跟蹤。目錄手把手教你學Dapr - 1. .Net開發者的大時代手把手教你學Dapr - 2. 必須知道的概念手把手教你學Dapr - 3. 使用Dapr運行第一個.Net程序手把手教你學Da...
閱讀 2496·2021-10-19 11:45
閱讀 2489·2021-09-30 09:56
閱讀 1442·2021-09-30 09:47
閱讀 602·2019-08-30 15:53
閱讀 1841·2019-08-30 15:44
閱讀 590·2019-08-30 12:52
閱讀 1093·2019-08-30 11:16
閱讀 1617·2019-08-29 16:36