亚洲免费不卡_在线视频精品_国产尤物精品_久久久久网址_久久精品91_欧美va天堂在线_狠狠入ady亚洲精品_亚洲午夜精品福利_国产精品草草_午夜精品久久99蜜桃的功能介绍

如何使錯誤日志更加方便排查問題
來源:易賢網 閱讀:1590 次 日期:2015-04-02 14:11:02
溫馨提示:易賢網小編為您整理了“如何使錯誤日志更加方便排查問題”,方便廣大網友查閱!

在程序中打錯誤日志的主要目標是為更好地排查問題和解決問題提供重要線索和指導。但是在實際中打的錯誤日志內容和格式變化多樣,錯誤提示上可能殘缺不全、沒有相關背景、不明其義,使得排查解決問題成為非常不方便或者耗時的操作。而實際上,如果編程的時候稍加用心,就會減少排查問題的很多無用功。 在闡述如何編寫有效的錯誤日志之前, 了解錯誤是怎么產生的, 非常重要。

錯誤是如何煉成的

對于當前系統來說, 錯誤的產生由三個地方引入:

1. 上層系統引入的非法參數。 對于非法參數引入的錯誤, 可以通過參數校驗和前置條件校驗來截獲錯誤;

2. 與下層系統交互產生的錯誤。 與下層交互產生的錯誤, 有兩種:

a. 下層系統處理成功了,但是通信出錯了, 這樣會導致子系統之間的數據不一致;

對于這種情況, 可以采用超時補償機制,預先將任務記錄下來,通過定時任務在后續將數據訂正過來。

更好的設計方案 ?

b. 通信成功了,但是下層處理出錯了。

對于這種情況, 需要與下層開發人員溝通, 協調子系統之間的交互;

需要根據下層返回的錯誤碼和錯誤描述做適當的處理或給予合理的提示信息。

無論哪一種情況, 都要假設下層系統可靠性一般, 做好出錯的設計考慮。

3. 本層系統處理出錯。

本層系統產生錯誤的原因:

原因一: 疏忽導致。疏忽是指程序員能力完全可避免此類錯誤但實際上沒做到。比如將 && 敲成了 & , == 敲成了 = ; 邊界錯誤, 復合邏輯判斷錯誤等。 疏忽要么是程序員注意力不夠集中, 比如處于疲倦狀態、加班通宵、邊開會邊寫程序; 要么是急著實現功能,沒有顧及程序的健壯性等。

改進措施: 使用代碼靜態分析工具,通過單元測試行覆蓋可有效避免此類問題。

原因二: 錯誤與異常處理不夠周全導致的。 比如輸入問題。 計算兩個數相加, 不僅要考慮計算溢出問題, 還要考慮輸入非法的情形。對于前者,可能通過了解、犯錯或經驗就可以避免, 而對于后者,則必須加以限定,以使之處于我們的智商能夠控制的范圍內,比如使用正則表達式過濾掉不合法的輸入。對于正則表達式必須進行測試。對于不合法輸入, 要給出盡可能詳細、易懂、友好的提示信息、原因及建議方案。

改進措施: 盡可能周全地考慮各種錯誤情形和異常處理。在實現主流程之后,增加一個步驟:仔細推敲可能的各種錯誤和異常,返回合理錯誤碼和錯誤描述。每個接口或模塊都有效處理好自己的錯誤和異常,可有效避免因場景交互復雜導致的bug. 譬如,一個業務用例由場景A.B.C交互完成。實際執行A.B成功了,C失敗了,這時B需要根據C返回合理的代碼和消息進行回滾并返回給A合理的代碼和消息,A根據B的返回進行回滾,并返回給客戶端合理的代碼和消息。這是一種分段回滾的機制,要求每個場景都必須考慮異常情況下的回滾。

原因三: 邏輯耦合緊密導致。 由于業務邏輯耦合緊密, 隨著軟件產品一步步發展, 各種邏輯關系錯綜復雜, 難以看到全局狀況, 導致局部修改影響波及到全局范圍,造成不可預知的問題。

改進措施: 編寫短函數和短方法, 每個函數或方法最好不超過 50 行。 編寫無狀態函數和方法, 只讀全局狀態, 相同的前提條件總是會輸出相同的結果, 不會依賴外部狀態而變更自己的行為; 定義合理的結構、 接口和邏輯段, 使接口之間的交互盡可能正交、低耦合; 對于服務層, 盡可能提供簡單、正交的接口; 持續重構, 保持應用模塊化和松耦合, 理清邏輯依賴關系。對于有大量業務接口相互影響的情況, 必須整理各個業務接口的邏輯流程及相互依賴關系, 從整體上進行優化; 對于有大量狀態的實體, 也需要梳理相關的業務接口, 整理狀態之間的轉換關系。

原因四: 算法不正確導致。

改進措施: 首先將算法從應用中分離出來。 若算法有多種實現, 可以通過交叉校驗的單元測試找出來, 比如排序操作; 如果算法具有可逆性質, 可以通過可逆校驗的單元測試找出來, 比如加密解密操作。

原因五: 相同類型的參數,傳入順序錯誤導致。比如,modifyFlow(int rx, int tx), 實際調用為 modifyFlow(tx,rx)

改進措施: 盡可能使類型具體化, 該用浮點數就用浮點數, 該用字符串就用字符串, 該用具體對象類型就用具體對象類型; 相同類型的參數盡可能錯開; 如果上述都無法滿足, 就必須通過接口測試來驗證, 接口參數值務必是不同的。

原因六: 空指針異常。 空指針異常通常是對象沒有正確初始化, 或者使用對象之前沒有對對象是否非空做檢測。

改進措施: 對于配置對象, 檢測其是否成功初始化; 對于普通對象, 獲取到實體對象使用之前, 檢測是否非空。

原因七: 網絡通信錯誤。 網絡通信錯誤通常是因為網絡延遲、阻塞或不通導致的錯誤。網絡通信錯誤通常是小概率事件, 但小概率事件很可能會導致大面積的故障、 難以復現的BUG。

改進措施: 在前一個子系統的結束點和后一個子系統的入口點分別打 INFO 日志。 通過兩者的時間差提供一點線索。

原因八: 事務與并發錯誤。 事務與并發結合在一起, 很容易產生非常難以定位的錯誤。

改進措施: 對于程序中的并發操作, 涉及到共享變量及重要狀態修改的, 要加 INFO 日志。更有效的做法???

原因九: 配置錯誤。

改進措施: 在啟動應用或啟動相應配置時, 檢測所有的配置項, 打印相應的INFO日志, 確保所有配置都加載成功。

原因十: 業務不熟悉導致的錯誤。 在中大型系統, 部分業務邏輯和業務交互都比較復雜, 整個的業務邏輯可能存在于多個開發同學的大腦里, 每個人的認識都不是完整的。這很容易導致業務編碼錯誤。

改進措施: 通過多人討論和溝通, 設計正確的業務用例, 根據業務用例來編寫和實現業務邏輯; 最終的業務邏輯和業務用例必須完整存檔; 在業務接口中注明該業務的前置條件、處理邏輯、后置校驗和注意事項; 當業務變化時, 需要同步更新業務注釋; 代碼REVIEW。 業務注釋是業務接口的重要文檔, 對業務理解起著重要的緩存作用。

原因十一: 設計問題導致的錯誤。比如同步串行方式會有性能、響應慢的問題, 而并發異步方式可以解決性能、響應慢的問題, 但會帶來安全、正確性的隱患。異步方式會導致編程模型的改變, 新增異步消息推送和接收等新的問題。使用緩存能夠提高性能, 但是又會存在緩存更新的問題。

改進措施: 編寫和仔細評審設計文檔。 設計文檔必須闡述背景、需求、所滿足的業務目標、要達到的業務性能指標、可能的影響、設計總體思路、詳細方案、預見該方案的優缺點及可能的影響; 通過測試和驗收, 確保改設計方案確實滿足業務目標和業務性能指標。

原因十二: 未知細節問題導致的錯誤。 比如緩沖區溢出、 SQL 注入攻擊。 從功能上看是沒有問題的, 但是從惡意使用上看, 是存在漏洞的。 再比如, 選擇 jackson 庫做 JSON 字符串解析, 默認情況下, 當對象新增字段時會導致解析出錯。必須在對象上加 @JsonIgnoreProperties(ignoreUnknown = true) 注解才能正確應對變化。如果選用其他 JSON 庫就不一定有這個問題。

改進措施: 一方面要通過經驗積累, 另一方面, 考慮安全問題和例外情況, 選擇成熟的經過嚴格測試的庫。

原因十三: 隨時間變化而出現的bug。有些解決方案在過去看來是很不錯的,但在當前或者未來的情景中可能變得笨拙甚至不中用,也是常見的事情。比如像加密解密算法, 在過去可能認為是完善的, 在破解之后就要慎重使用了。

改進措施: 關注變化以及漏洞修復消息,及時修正過時的代碼、庫、行為。

原因十四: 硬件相關的錯誤。 比如內存泄露, 存儲空間不足, OutOfMemoryError 等。

改進措施: 增加對應用系統的 CPU / 內存 / 網絡等重要指標的性能監控。

系統出現的常見錯誤:

實體在數據庫中的記錄不存在, 必須指明是哪個實體或實體標識;

實體配置不正確, 必須指明是哪個配置有問題,正確的配置應該是什么;

實體資源不滿足條件, 必須指明當前資源是什么,資源要求是什么;

實體操作前置條件不滿足, 必須指明需要滿足什么前置條件,當前的狀態是什么;

實體操作后置校驗不滿足, 必須指明需要滿足什么后置校驗, 當前的狀態是什么;

性能問題導致超時, 必須指明是什么導致的性能問題,后續如何優化;

多個子系統交互通信出錯導致之間的狀態或數據不一致?

一般難以定位的錯誤會出現在比較底層的地方。 因為底層無法預知具體的業務場景, 給出的錯誤消息都是比較通用的。

這就要求在業務上層提供盡可能豐富的線索。錯誤的產生一定是多個系統或層次交互的過程中在某一層棧上不滿足前置條件導致。在編程時, 在每一層棧中盡可能確保所有必須的前置條件滿足,盡可能避免錯誤的參數傳遞到底層, 盡可能地將錯誤截獲在業務層。

大多數錯誤都是由多種原因組合產生。 但每一種錯誤必定有其原因。 在解決錯誤之后, 要深入分析錯誤是如何發生的, 如何避免這些錯誤再次發生。 努力就能成功, 但是: 反思才能進步 !

如何編寫更容易排查問題的錯誤日志

打錯誤日志的基本原則:

盡可能完整。 每一條錯誤日志都完整描述了: 什么場景下發生了什么錯誤, 什么原因(或者哪些可能原因), 如何解決(或解決提示);

盡可能具體。 比如 NC 資源不足, 究竟具體指什么資源不足, 是否可以通過程序直接指明; 通用錯誤,比如 VM NOT EXIST , 要指明在什么場景下發生的,可能便于后續統計的工作。

盡可能直接。 最理想的錯誤日志應該讓人在第一直覺下能夠知道是什么原因導致,該怎么去解決,而不是還要通過若干步驟去查找真正的原因。

將已有經驗集成直接到系統中。 所有已經解決過的問題及經驗都要盡可能以友好的方式集成到系統中,給新進人員更好的提示,而不是埋藏在其他地方。

排版要整潔有序, 格式統一化規范化。 密密麻麻、隨筆式的日志看著就揪心, 相當不友好, 也不便于排查問題。

采用多個關鍵字唯一標識請求,突出顯示關鍵字: 時間、實體標識(比如vmname)、操作名稱。

排查問題的基本步驟:

登錄到應用服務器 -> 打開日志文件 -> 定位到錯誤日志位置 -> 根據錯誤日志的線索的指導去排查、確認問題和解決問題。

其中:

從登陸到打開日志文件: 由于應用服務器有多臺, 要逐一登錄上去查看實在不方便。 需要編寫一個工具放在 AG 上直接在 AG 上查看所有服務器日志, 甚至直接篩選出所需要的錯誤日志。

定位錯誤日志位置。 目前日志的排版密密麻麻,不易定位到錯誤日志。一般可以先采用”時間”來定位到錯誤日志的附近前面的地方, 然后使用 實體關鍵字 / 操作名稱 組合來鎖定錯誤日志地方。 根據 requestId 定位錯誤日志雖然比較符合傳統,但是要先找到 requestId , 并且不具有描述性。最好能直接根據時間/內容關鍵字來定位錯誤日志位置。

分析錯誤日志。 錯誤日志的內容最好能夠更加直接明了, 能夠明確指明與當前要排查的問題特征是吻合的, 并且給出重要線索。

通常, 程序錯誤日志的問題就是日志內容是針對當前代碼情境才能理解,看上去簡潔, 但總是寫的不全, 半英文格式;一旦離開代碼情境, 就很難知道究竟說的是什么, 非要讓人思考一下或者去看看代碼才能明白日志說的是什么含義。 這不是自己給自己罪受?

比如:

if ((storageType == StorageType.dfs1 || storageType == StorageType.dfs2)

&& (zone.hasStorageType(StorageType.io3) || zone.hasStorageType(StorageType.io4))) {

// 進入dfs1 和dfs2 在io3 io4 存儲。

} else {

log.info("zone storage type not support, zone: " + zone.getZoneId() + ", storageType: "

+ storageType.name());

throw new BizException(DeviceErrorCode.ZONE_STORAGE_TYPE_NOT_SUPPORT);

}

zone 要支持什么 storage type 才是正確的? Do Not Let Me Think !

錯誤日志應該做到: 即使離開代碼情境,也能清晰地描述發生了什么。

此外,如果能夠直接在錯誤日志中說明清楚原因, 在做巡檢日志的時候也可以省些力氣。

從某種意義上來說, 錯誤日志也可以是一種非常有益的文檔,記錄著各種不合法的運行用例。

目前程序錯誤日志的內容可能存在如下問題:

1. 錯誤日志沒有指明錯誤參數和內容:

catch(Exception ex){

log.error("control ip insert failed", ex);

return new ResultSet<AddControlIpResponse>(

ControlIpErrorCode.ERROR_CONTROL_IP_INSERT_FAILURE);

}

沒有指明插入失敗的 control ip. 如果加上 control ip 關鍵字, 更容易搜索和鎖定錯誤。

類似的還有:

log.error(“Get some errors when insert subnet and its IPs into database. Add subnet or IP failure.”, e);

沒有指明是哪個 subnet 的它下屬的哪些 IP. 值得注意的是, 要指明這些要額外做一些事情, 可能會稍微影響性能。這時候需要權衡性能和可調試性。

解決方案: 使用 String.format(“Some msg to ErrorObj: %s”, errobj) 方法指明錯誤參數及內容。

這通常要求對 DO 對象編寫可讀的 toString 方法。

2. 錯誤場景不明確:

log.error(“nc has exist, nc ip” + request.getIp());

在 createNc 中檢測到 NC 已經存在報錯。 但是日志上沒有指明錯誤場景, 讓人猜測,為什么會報NC已存在錯誤。

可以改為

log.error(“nc has exist when want to create nc, please check nc parameters. Given nc ip: ” + request.getIp());

log.error(“[create nc] nc has exist, please check nc parameters. Given nc ip: ” + request.getIp());

類似的還有:

log.error(“not all vm destroyed, nc id ” + request.getNcId());

改成 log.error(“[delete nc] some vms [%s] in the nc are not destroyed. nc id: %s”, vmNames, request.getNcId());

解決方案: 錯誤消息加上 when 字句, 或者錯誤消息前加上 【接口名】, 指明錯誤場景,直接從錯誤日志就知道明白了。一般能夠知道 executor 的可以加上 【接口名】, service 加上 when 字句。

3. 內容不明確, 或不明其義:

if(aliMonitorReporter == null) {

log.error("aliMonitorReporter is null!");

} else {

aliMonitorReporter.attach(new ThreadPoolMonitor(namePrefix, asynTaskThreadPool.getThreadPoolExecutor()));

}

改為:log.error(“aliMonitorReporter is null, probably not initialized properly, please check configuration in file xxx.”);

類似的還有:

if (diskWbps == null && diskRbps == null && diskWiops == null && diskRiops == null) {

log.error("none of attribute is specified for modifying");

throw new BizException(DeviceErrorCode.NO_ATTRIBUTE_FOR_MODIFY);

}

改為 log.error(“[modify disk attribute] None of [diskWbps,diskRbps,diskWiops,diskRiops] is specified for disk id:” + diskId);

解決方案: 更清晰貼切地描述錯誤內容。

4. 排查問題的引導內容不明確:

log.error(“get gw group ip segment failed. zkPath: ” + LockResource.getGwGroupIpSegmnetLockPath(request.getGwGroupId()));

zkPath ? 如何去排查這個問題? 我該去找誰? 到哪里去查找更具體的線索?

解決方案: 加上相應的背景知識和引導排查措施。

5. 錯誤內容不夠具體細致:

if (!ncResourceService.isNcResourceEnough(ncResourceDO, vmResourceCondition)) {

log.error("disk space is not enough at vm's nc, nc id:" + vmDO.getNcId());

throw new BizException(ResourceErrorCode.ERROR_RESOURCE_NOT_ENOUGH);

}

究竟是什么資源不夠? 目前剩余多少? 現在需要多少? 值得注意的是, 要指明這些要額外做一些事情, 可能會稍微影響性能。這時候需要權衡性能和可調試性。

解決方案: 通過改進程序或程序技巧, 盡可能揭示出具體的差異所在, 減少人工比對的操作。

6. 半英文句式讀起來不夠清晰明白,需要思考來拼湊起完整的意思:

log.warn(“cache status conflict, device id “+deviceDO.getId()+” db status “+deviceDO.getStatus() +”, nc status “+ status);

改為:

log.warn(String.format(“[query cache status] device cache status conflicts between regiondb and nc, status of device ‘%s’ in regiondb is %s , but is %s in nc.”, deviceDO.getId(), deviceDO.getStatus(), status));

解決方案: 改為自然可讀的英文句式。

總結起來, 錯誤日志格式可以為:

log.error(“[接口名或操作名] [Some Error Msg] happens. [params] [Probably Because]. [Probably need to do].”);

log.error(String.format(“[接口名或操作名] [Some Error Msg] happens. [%s]. [Probably Because]. [Probably need to do].”, params));

log.error(“[Some Error Msg] happens to 錯誤參數或內容 when [in some condition]. [Probably Because]. [Probably need to do].”);

log.error(String.format(“[Some Error Msg] happens to %s when [in some condition]. [Probably Because]. [Probably need to do].”, parameters));

[Probably Reason]. [Probably need to do]. 在某些情況下可以省略; 在一些重要接口和場景下最好能說明一下。

每一條錯誤日志都是獨立的,盡可能完整、具體、直接說明何種場景下發生了什么錯誤,由什么原因導致,要采用什么措施或步驟。

問題:

String.format 的性能會影響打日志嗎? 一般來說, 錯誤日志應該是比較少的, 使用 String.format 的頻度并不會太高,不會對應用和日志造成影響。

開發時間非常緊張時, 有時間去斟酌字句嗎? 建立一個標準化的內容格式,將內容往格式套,可以節省斟酌字句的時間。

什么時候使用 info, warn , error ?

info 用于打印程序應該出現的正常狀態信息, 便于追蹤定位;

warn 表明系統出現輕微的不合理但不影響運行和使用;

error 表明出現了系統錯誤和異常,無法正常完成目標操作。

錯誤日志是排查問題的重要手段之一。 當我們編程實現一項功能時, 通常會考慮可能發生的各種錯誤及相應原因:

要排查出相應的原因, 就需要一些關鍵描述來定位原因。這就會形成三元組:

錯誤現象 -> 錯誤關鍵描述 -> 最終的錯誤原因。

需要針對每一種錯誤盡可能提供相應的錯誤關鍵描述,從而定位到相應的錯誤原因。

也就是說,編程的時候,要仔細思考, 哪些描述是非常有利于定位錯誤原因的, 盡可能將這些描述添加到錯誤日志中。

文中沒有指出的問題或困難, 請提出你的建議。

更多信息請查看IT技術專欄

更多信息請查看技術文章
易賢網手機網站地址:如何使錯誤日志更加方便排查問題
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點

版權所有:易賢網

亚洲免费不卡_在线视频精品_国产尤物精品_久久久久网址_久久精品91_欧美va天堂在线_狠狠入ady亚洲精品_亚洲午夜精品福利_国产精品草草_午夜精品久久99蜜桃的功能介绍
久久精品人人| 欧美日韩岛国| 在线成人黄色| 亚洲一区二区免费看| 午夜在线精品| 欧美色图首页| 日韩一区二区免费看| 免费在线亚洲| 亚洲精品麻豆| 欧美日韩精品免费看| 亚洲少妇一区| 韩国一区二区三区在线观看| 在线亚洲观看| 黑人巨大精品欧美一区二区小视频| 亚洲免费激情| 亚洲手机视频| 欧美一区亚洲| 国产农村妇女毛片精品久久莱园子| 久久资源在线| 国产精品免费在线| 影音先锋在线一区| 欧美日韩国产探花| 欧美中文字幕| 国产精品一区毛片| 亚洲经典三级| 国产精品二区在线| 久久久久国产精品一区二区| 亚洲精品孕妇| 一区在线免费观看| 欧美日韩一区二区三区在线观看免 | 99精品视频免费全部在线| 久久国产日韩欧美| 国产视频一区在线观看一区免费| 影音国产精品| 亚洲黄色免费| 亚洲巨乳在线| 亚洲免费高清| 日韩亚洲视频| 夜夜嗨一区二区三区| 91久久精品一区二区别| 亚洲午夜精品福利| 亚洲图片在线| 久久精品免费| 在线亚洲成人| av不卡在线看| 亚洲开发第一视频在线播放| 黄色精品网站| 亚洲国产高清视频| 日韩亚洲视频| 亚洲一区在线免费| 国产精品视区| 久久久天天操| 欧美日韩精品免费观看视一区二区| 久久精品在线| 欧美日韩1080p| 欧美日本国产| 激情欧美丁香| 国产一级精品aaaaa看| 国产三级精品在线不卡| 亚洲综合首页| 欧美精品入口| 影音先锋在线一区| 国产一级一区二区| 欧美在线日韩| 激情视频一区二区| 国产精品女主播一区二区三区| 性欧美videos另类喷潮| 久久综合影音| 国产精品二区在线| 99精品国产在热久久| 国产精品一区在线播放| 欧美一区影院| 亚洲日本精品国产第一区| 99精品欧美一区二区三区| 性久久久久久| 在线看无码的免费网站| 欧美资源在线| 一区二区自拍| 久久婷婷影院| 亚洲伦理精品| 欧美高清一区二区| 夜夜爽99久久国产综合精品女不卡| 麻豆av一区二区三区| 国内精品福利| 久久精品亚洲一区二区| 一区二区亚洲精品| 乱码第一页成人| 亚洲高清在线播放| 欧美在线网站| 午夜亚洲福利在线老司机| 欧美福利电影在线观看| 国产精品美女久久久| 亚洲婷婷免费| 欧美精品一区在线| 媚黑女一区二区| 国产精品视频久久一区| 亚洲国产午夜| 欧美日韩亚洲一区三区| 久久经典综合| 亚洲男人影院| 国产欧美日韩亚洲| 亚洲久久在线| 亚洲精品一品区二品区三品区| 午夜精品亚洲一区二区三区嫩草| 亚洲男人影院| 国产精品亚洲欧美| 在线亚洲激情| 99视频一区| 亚洲国产婷婷| 亚洲日本久久| 99在线精品免费视频九九视 | 乱码第一页成人| 夜夜嗨网站十八久久| 在线看片成人| 最新国产乱人伦偷精品免费网站| 欧美二区不卡| 欧美日韩国产探花| 你懂的国产精品| 久久婷婷影院| 欧美精品七区| 亚洲视频高清| 亚洲黄色影片| 中文精品在线| 免费在线播放第一区高清av| 欧美综合77777色婷婷| 久久精品一区| 国产精品hd| 狠久久av成人天堂| 在线精品一区| 国产欧美日韩一级| 美女精品国产| 欧美日韩一区二区国产| 精品999网站| 夜夜嗨av一区二区三区网站四季av| 亚洲免费成人| 蜜桃久久精品乱码一区二区| 午夜精品久久| 亚洲精品1区| 亚洲欧美日韩在线综合| 欧美一区91| 亚洲天堂偷拍| 性伦欧美刺激片在线观看| 欧美一区二区三区四区夜夜大片| 欧美特黄一级| 国产亚洲一区在线| 午夜日韩在线| 99精品国产高清一区二区 | 麻豆av一区二区三区久久| 欧美永久精品| 亚洲精品乱码久久久久久蜜桃麻豆 | 久久一二三四| 韩日午夜在线资源一区二区| 亚洲国产精品第一区二区三区| 国产精品日韩二区| 国产精品草草| 免费看黄裸体一级大秀欧美| 欧美日韩一区二区视频在线观看| 伊人成年综合电影网| 国产麻豆综合| 亚洲性图久久| 久久久久久精| 国产精品久久久一区二区| 欧美不卡三区| 国产精品裸体一区二区三区| 欧美视频成人| 久久久久网址| 国产精品一区二区三区免费观看| 亚洲小说欧美另类婷婷| 久久精品中文| 亚洲一级在线| 99综合在线| 黑丝一区二区三区| 欧美一区二区三区四区夜夜大片| 国产日韩精品视频一区二区三区| 国产在线一区二区三区四区 | 18成人免费观看视频| 欧美影院一区| 久久国产成人| 国产精品区一区| 最新日韩在线| 欧美日韩调教| 欧美理论在线| 欧美在线3区| 乱人伦精品视频在线观看| 国产一区二区三区免费不卡| 亚洲国产精品久久久久久女王| 欧美日韩国产成人精品| 牛夜精品久久久久久久99黑人| 亚洲欧美日本日韩| 午夜在线视频观看日韩17c| 99精品热6080yy久久| 最新亚洲一区| 亚洲人成毛片在线播放女女| 亚洲丰满在线| 亚洲激情一区二区| 夜夜嗨网站十八久久| 在线看无码的免费网站| 亚洲国产专区校园欧美| 91久久久久| 99精品国产在热久久婷婷| 亚洲精品1234| 亚洲一区精彩视频| 久久久精品五月天| 欧美韩日精品| 亚洲黄色影片| 先锋影音久久| 欧美日韩亚洲一区| 亚洲精品在线观看免费| 国产视频一区欧美| 久久久精品性| 国内外成人免费视频| 亚洲人体大胆视频| 亚洲综合国产激情另类一区| 欧美在线高清| 亚洲激情专区| 久久久久久精| 亚洲人成免费| 久久久久久精| 亚洲国产婷婷香蕉久久久久久99| 国产日韩欧美亚洲一区| 久久亚裔精品欧美| 激情国产一区| 蜜桃av综合| 韩国一区二区三区美女美女秀| 亚洲精品在线二区| 牛夜精品久久久久久久99黑人| 亚洲私拍自拍| 鲁大师影院一区二区三区| 欧美日韩在线高清| 国产亚洲一区在线播放| 欧美亚洲不卡| 午夜在线一区二区| 激情一区二区| 欧美不卡福利| 国产精品毛片| 亚洲高清在线观看一区| 久久尤物视频| 国产视频一区在线观看一区免费| 欧美激情视频一区二区三区在线播放| 99精品视频免费观看| 欧美日韩国产探花| 久久大香伊蕉在人线观看热2| 精品动漫3d一区二区三区免费版| 久久精品欧洲| 欧美亚洲一区| 日韩天堂av| 在线高清一区| 国产精品sm| 欧美凹凸一区二区三区视频| 在线亚洲观看| 日韩香蕉视频| 亚洲区一区二| 亚洲精品在线免费| 好看不卡的中文字幕| 欧美另类视频| 欧美欧美天天天天操| 狂野欧美性猛交xxxx巴西| 国产精品视频久久一区| 亚洲国产日韩综合一区| 韩国亚洲精品| 国内激情久久| 狠狠久久婷婷| 狠狠色噜噜狠狠色综合久| 欧美日韩在线不卡一区| 欧美午夜精品理论片a级大开眼界| 久久婷婷一区| 欧美日韩国产三区| 国内一区二区在线视频观看 | 在线视频亚洲| 亚洲视频播放| 亚洲免费综合| 久久综合伊人| 欧美日韩日本国产亚洲在线| 欧美精品入口| 在线精品一区| 国产亚洲精品v| 国产精品免费区二区三区观看| 国产欧美一区二区色老头| 亚洲少妇诱惑| 久久精品人人| 红桃视频国产一区| 一区二区三区四区五区精品视频| 一区二区三区免费看| 国产伦精品一区| 亚洲一区二区免费看| 久久国产精品亚洲77777| 久久久99国产精品免费| 欧美日韩亚洲免费| 在线观看的日韩av| 国产精品手机在线| 欧美人成在线| 一区二区三区导航| 欧美福利一区| 国产欧美日韩一级| 欧美日本在线| 一区二区三区四区五区精品| 西西人体一区二区| 欧美日韩亚洲一区二区三区在线观看| 禁久久精品乱码| 性欧美暴力猛交另类hd| 国内精品久久久久久久影视蜜臀| 亚洲黄色一区二区三区| 久久精品国语| 最新亚洲视频| 女主播福利一区| 99亚洲精品| 狠狠综合久久av一区二区老牛| 99日韩精品| 欧美日韩国产探花| 国产精品一区二区三区观看| 欧美精品免费观看二区| 国产婷婷精品| 影音欧美亚洲| 欧美日韩视频在线一区二区观看视频 | 羞羞答答国产精品www一本 | 午夜在线视频观看日韩17c| 国产一区激情| 久久亚洲国产精品一区二区| 亚洲狼人精品一区二区三区| 欧美女激情福利| 久久精品天堂| 国产精品综合| 亚洲日本无吗高清不卡| 欧美二区在线| 欧美中日韩免费视频| 一区二区三区四区国产| 永久久久久久| 欧美日韩喷水| 欧美国产先锋| 你懂的国产精品| 蜜乳av另类精品一区二区| 国产精品夜夜夜| 一区二区福利| 中文久久精品| 国产午夜久久| 国产欧美另类| 国产精品手机视频| 99pao成人国产永久免费视频| 韩国亚洲精品| 亚洲午夜在线| 精久久久久久| 亚洲国产导航| 99爱精品视频| 国产伦精品一区二区三区视频黑人| 亚洲经典自拍| 一区二区国产精品| 国产麻豆综合| 欧美一级视频| 快she精品国产999| 欧美成人久久| 欧美日韩免费观看一区| 欧美三区在线| 在线精品福利| 国产视频一区三区| 亚洲欧美日韩国产| 久久精品人人做人人爽电影蜜月| 久久国产日韩| 国产精品mv在线观看| 国产精品v欧美精品v日韩精品| 国产精品v欧美精品v日韩| 伊人久久亚洲影院| 国产精品呻吟| 欧美久久久久久久| 亚洲激情国产| 美女黄网久久| 伊人精品视频| 久久大香伊蕉在人线观看热2| 欧美在线播放一区二区| 激情欧美一区| 免费日韩精品中文字幕视频在线| 久久一二三四| 亚洲黄色高清| 久久视频一区| 亚洲精品裸体| 玖玖精品视频| 一区二区激情| 午夜视频精品| 国产婷婷精品| 国产精品av久久久久久麻豆网| 亚洲人成免费| 欧美日韩国产高清视频| 一区二区日韩免费看| 欧美日韩国产在线一区| 国产一区二区黄色| 国产精品扒开腿做爽爽爽软件| 国产精品美女久久久| 亚洲午夜在线观看| 久久久国产精品一区二区中文| 在线精品亚洲| 欧美日韩在线播放一区二区| 亚洲影视综合| 日韩图片一区| 欧美日韩精选| 久久久精品国产一区二区三区| 日韩一级精品| 伊人天天综合| 欧美精品成人| 久久国产免费| 国产精品日韩欧美一区| 伊人久久成人|