国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

通過唯一ID實現(xiàn)簡單的日志跟蹤實現(xiàn)

BakerJ / 3183人閱讀

摘要:在實際項目中,通知我們需要記錄一些日志,方便問題核查。但是日志多了就很容易混亂,請求,響應(yīng),執(zhí)行中的日志無法對應(yīng),這時就需要為請求進(jìn)行標(biāo)記唯一來進(jìn)行跟蹤。

在實際項目中,通知我們需要記錄一些日志,方便問題核查。但是日志多了就很容易混亂,請求,響應(yīng),執(zhí)行中的日志無法對應(yīng),這時就需要為請求進(jìn)行標(biāo)記唯一ID來進(jìn)行跟蹤。

/**
 * 記錄請求日志
 *
 * 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"]);
        }
        // ...... 日志中對關(guān)鍵信息進(jìn)行加密
        
        // 請求日志記錄詳細(xì)一點
        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");

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/29526.html

相關(guān)文章

  • 分布式調(diào)用跟蹤實戰(zhàn)

    摘要:為了追蹤一個請求完整的流轉(zhuǎn)過程,我可以給請求分配一個唯一的,當(dāng)請求調(diào)用其他服務(wù)時,我們傳遞這個。這是一個簡單的實現(xiàn)分布式調(diào)用追蹤的實踐,以上。 背景 分布式環(huán)境下,跨服務(wù)之間的調(diào)用錯綜復(fù)雜,如果突然爆出一個錯誤,雖然有日志記錄,但到底是哪個服務(wù)出了問題呢?是移動端傳的參數(shù)有錯誤,還是系統(tǒng)X或者系統(tǒng)Y提供的接口導(dǎo)致?在這種情況下,錯誤排查起來就非常費勁。 為了追蹤一個請求完整的流轉(zhuǎn)過程,...

    jlanglang 評論0 收藏0
  • 日志排查問題困難?分布式日志鏈路跟蹤來幫你

    摘要:當(dāng)前線程的子線程會繼承其父線程中的的內(nèi)容。若希望在線程池與主線程間傳遞,需配合和使用。 一、背景 開發(fā)排查系統(tǒng)問題用得最多的手段就是查看系統(tǒng)日志,在分布式環(huán)境中一般使用ELK來統(tǒng)一收集日志,但是在并發(fā)大時使用日志定位問題還是比較麻煩,由于大量的其他用戶/其他線程的日志也一起輸出穿行其中導(dǎo)致很難篩選出指定請求的全部相關(guān)日志,以及下游線程/服務(wù)對應(yīng)的日志。 ? 二、解決思路 每個請求都使...

    EasonTyler 評論0 收藏0
  • Redux 莞式教程 之 簡明篇

    摘要:只要一個有,那無論用什么設(shè)備訪問,都會得到這個還原也是相當(dāng)簡單把數(shù)據(jù)庫備份導(dǎo)入到另一臺機(jī)器,部署同樣的運行環(huán)境與代碼。純粹只是一個狀態(tài)管理庫,幾乎可以搭配任何框架使用上述例子連都沒用哦親下一章進(jìn)階教程 Redux 簡明教程 原文鏈接(保持更新):https://github.com/kenberkele... 寫在前面 本教程深入淺出,配套 簡明教程、進(jìn)階教程(源碼精讀)以及文檔注釋...

    notebin 評論0 收藏0
  • 手把手教你學(xué)Dapr

    摘要:配置配置使用概率抽樣。采樣率定義了對跟蹤跨度進(jìn)行采樣的概率,其值可以介于和含之間。例如,以下配置對象將采樣率更改為即每個跨度都被采樣,并使用協(xié)議將跟蹤發(fā)送到位于的服務(wù)器文件路徑注將采樣率更改為會完全禁用跟蹤。目錄手把手教你學(xué)Dapr - 1. .Net開發(fā)者的大時代手把手教你學(xué)Dapr - 2. 必須知道的概念手把手教你學(xué)Dapr - 3. 使用Dapr運行第一個.Net程序手把手教你學(xué)Da...

    qqlcbb 評論0 收藏0

發(fā)表評論

0條評論

BakerJ

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<