Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 永远电影免费观看日本 ,国产精品福利一区二区久久 ,成人精品在线视频

          整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          關(guān)于監(jiān)控、鏈路追蹤、日志三者的區(qū)別

          關(guān)于監(jiān)控、鏈路追蹤、日志三者的區(qū)別

          . 監(jiān)控、鏈路追蹤、日志

          對(duì)于一個(gè)系統(tǒng)來說,監(jiān)控、鏈路追蹤、日志的這三者需求都是必然存在的,而有的時(shí)候我們會(huì)搞不清楚這三者相互之間是什么關(guān)系。我之前在做系統(tǒng)設(shè)計(jì)的時(shí)候也考慮過,是不是有必要引入那么多組件,畢竟如果這三者完全分開每一個(gè)一項(xiàng)的話,就有三個(gè)組件了(事實(shí)上就是:Prometheus+Grafana、Jaeger、ELK)。

          因此想做個(gè)筆記嘗試舉例來梳理下。

          外部鏈接:

          • Metrics, tracing, and logging地址:http://peter.bourgon.org/blog/2017/02/21/metrics-tracing-and-logging.html

          2. 監(jiān)控

          Monitoring(監(jiān)控)舉例來說就是:定期體檢。使用監(jiān)控系統(tǒng)把需要關(guān)注的指標(biāo)采集起來,形成報(bào)告,并對(duì)需要關(guān)注的異常數(shù)據(jù)進(jìn)行分析形成告警。

          特點(diǎn)是:

          • 低頻
          • 定期
          • 定量

          這也是Prometheus的架構(gòu)做得非常簡單的原因,Monitoring的需求并沒有包含非常高的并發(fā)量和通訊量。反過來說:高并發(fā)、大數(shù)據(jù)量的需求并不適用于Monitoring這個(gè)點(diǎn)。

          3. 鏈路追蹤

          Tracing(鏈路追蹤)舉例來說就是:對(duì)某一項(xiàng)工作的定期匯報(bào)。某個(gè)工作開始做了A,制作A事件的報(bào)告,收集起來,然后這個(gè)工作還有B、C、D等條目,一個(gè)個(gè)處理,然后都匯總進(jìn)報(bào)告,最終的結(jié)果就是一個(gè)Tracing。

          特點(diǎn)是:

          • 高頻
          • 巨量
          • 有固定格式

          因?yàn)門racing是針對(duì)某一個(gè)事件(一般來說就是一個(gè)API),而這個(gè)API可能會(huì)和很多組件進(jìn)行溝通,后續(xù)的所有的組件溝通無論是內(nèi)部還是外部的IO,都算作這個(gè)API調(diào)用的Tracing的一部分。可以想見在一個(gè)業(yè)務(wù)繁忙的系統(tǒng)中,API調(diào)用的數(shù)量已經(jīng)是天文數(shù)字,而其衍生出來的Tracing記錄更是不得了的量。其特點(diǎn)就是高頻、巨量,一個(gè)API會(huì)衍生出大量的子調(diào)用。

          也因此適合用來做Monitoring的系統(tǒng)就不一定適合做Tracing了,用Prometheus這樣的系統(tǒng)來做Tracing肯定完蛋(Prometheus只有拉模式,全部都是HTTP請(qǐng)求,高并發(fā)直接掛掉)。一般來說Tracing系統(tǒng)都會(huì)在本地磁盤IO上做日志(最高效、也是最低的Cost),然后再通過本地Agent慢慢把文本日志數(shù)據(jù)發(fā)送到聚合服務(wù)器上,甚至可能在聚合服務(wù)器和本地的Agent之間還需要做消息隊(duì)列,讓聚合服務(wù)器慢慢消化巨量的消息。

          Tracing在現(xiàn)在的業(yè)界是有標(biāo)準(zhǔn)的:OpenTracing,因此它不是很隨意的日志/事件聚合,而是有格式要求的日志/事件聚合,這就是Tracing和Logging最大的不同。

          4. 日志

          Logging(日志)舉例來說就是:廢品回收站。各種各樣的物品都會(huì)匯總進(jìn)入到配品回收站里,然后經(jīng)過分門別類歸納整理,成為各種可回收資源分別回收到商家那里。一般來說我們?cè)诖笮拖到y(tǒng)中提到Logging說的都不是簡單的日志,而是日志聚合系統(tǒng)。

          從本質(zhì)上來說,Monitoring和Tracing都是Logging,Logging是這三者中覆蓋面最大的超集,而前兩者則是其一部分的子集。Logging最麻煩的是,開發(fā)者也不會(huì)完全知道最后記錄進(jìn)入到日志系統(tǒng)里的一共會(huì)有哪些東西,只有在使用(檢索)的時(shí)候才可能需要匯總查詢總量中的一部分。

          要在一般的Loggin系統(tǒng)中進(jìn)行Monitoring也是可以的,直接把聚合進(jìn)來的日志數(shù)據(jù)提取出來,定期形成數(shù)據(jù)報(bào)告,就是監(jiān)控了。Tracing也是一樣,只要聚合進(jìn)了Logging系統(tǒng),有了原始數(shù)據(jù),后面要做都是可以做的。因此Logging系統(tǒng)最為通用,其特點(diǎn)和Tracing基本一致,也是需要處理高頻并發(fā)和巨大的數(shù)據(jù)量。

          5. 總結(jié)

          這樣一看就很清楚了,每個(gè)組件都有其存在的必要性:

          • Monitoring系統(tǒng)(Prometheus)從根本的需求和基本設(shè)計(jì)上就不可能支持Tracing和Logging:低頻 vs 高頻、低量 vs 高量,其從設(shè)計(jì)到實(shí)現(xiàn)就只為了監(jiān)控服務(wù)
          • Tracing系統(tǒng)(Jaeger)對(duì)提供的數(shù)據(jù)有格式要求,且處理方式和一般的Logging也不同,有更限定的應(yīng)用范圍
          • Logging系統(tǒng)(ELK)可以處理前兩者的需求,但前兩者的領(lǐng)域有更專業(yè)的工具就不推薦直接使用普通的日志聚合系統(tǒng)了;Logging系統(tǒng)一般用來處理大型系統(tǒng)的日志聚合以及檢索查詢

          . 背景

          隨著分布式應(yīng)用的普及,現(xiàn)在的一些應(yīng)用系統(tǒng)不再像以前,所有的文件(前后端程序)都打包在一個(gè)包中,現(xiàn)在的很多應(yīng)用都是模塊化開發(fā),開發(fā)的團(tuán)隊(duì)也是不一樣,服務(wù)與服務(wù)之間的調(diào)用也比較多,在這種情況下,系統(tǒng)的日志就顯得尤其的重要,然而,在多數(shù)情況下,當(dāng)我們的系統(tǒng)出現(xiàn)了異常,需要查看日志時(shí),就會(huì)很抓狂。為了避免這種情況,我們需要把同一次的業(yè)務(wù)調(diào)用鏈上的日志串聯(lián)起來。

          本次通過一個(gè)簡單的SpringBoot應(yīng)用來總結(jié),我們?nèi)绾螌⑷罩敬?lián)起來,以下截圖是最終的實(shí)現(xiàn)效果

          二. 代碼演示

          1. 創(chuàng)建一個(gè)SpringBoot項(xiàng)目

          使用idea創(chuàng)建一個(gè)SpringBoot項(xiàng)目的詳細(xì)步驟,本文不介紹了,具體的步驟,網(wǎng)上有很多例子可以參考

          1.1. 我的SpringBoot項(xiàng)目名稱是:springboot-track,以下是工程pom.xml文件中所需要的必要依賴

          xml

          復(fù)制代碼

          <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>

          1.2. 在項(xiàng)目的resource目錄下,創(chuàng)建日志框架整合配置文件:logback-spring.xml文件內(nèi)容配置如下:

          xml

          復(fù)制代碼

          <?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!--日志存儲(chǔ)路徑--> <property name="log" value="/Users/username/Downloads"/> <!-- 控制臺(tái)輸出 --> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--輸出格式化--> <pattern>[%X{TRACE_ID}] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> </appender> <!-- 按天生成日志文件 --> <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件名--> <FileNamePattern>${log}/%d{yyyy-MM-dd}.log</FileNamePattern> <!--保留天數(shù)--> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>[%X{TRACE_ID}] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> <!--日志文件最大的大小--> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10MB</MaxFileSize> </triggeringPolicy> </appender> <!-- 日志輸出級(jí)別 --> <root level="INFO"> <appender-ref ref="console"/> <appender-ref ref="file"/> </root> </configuration>

          1.3. 在項(xiàng)目的resource目錄下的主配置文件(application.yml)中添加日志整合配置信息,添加內(nèi)容如下:

          需要注意的是:使用idea創(chuàng)建的SpringBoot項(xiàng)目,application文件的默認(rèn)后綴是.properties,本人比較喜歡.yml文件,所以將文件后綴名修改了一下

          yaml

          復(fù)制代碼

          server: port: 8080 logging: config: classpath:logback-springboot.xml pattern: dateformat: MM-dd HH:mm:ss

          1.4. 自定義日志攔截器:LogInterceptor.java

          java

          復(fù)制代碼

          public class LogInterceptor implements HandlerInterceptor { private static final String TRACE_ID="TRACE_ID"; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 使用UUID自動(dòng)生成鏈路ID String tid=UUID.randomUUID().toString().replace("-", ""); // 客戶端可以傳入鏈路ID,需要唯一性 String traceId=request.getHeader(TRACE_ID); if (!StringUtils.isEmpty(traceId)) { tid=request.getHeader(TRACE_ID); } // MDC(Mapped Diagnostic Context)診斷上下文映射,是@Slf4j提供的一個(gè)支持動(dòng)態(tài)打印日志信息的工具 MDC.put(TRACE_ID, tid); return true; } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { MDC.remove(TRACE_ID); } }

          自定義的攔截器需要實(shí)現(xiàn)HandlerInterceptor.java接口,然后重寫preHandle方法;MDC(Mapped Diagnostic Context)診斷上下文映射,@Slf4j提供的動(dòng)態(tài)打印日志工具。

          1.5. 添加攔截器:WebConfigurerAdapter.java

          typescript

          復(fù)制代碼

          @Configuration public class WebConfigurerAdapter implements WebMvcConfigurer { @Bean public LogInterceptor logInterceptor() { return new LogInterceptor(); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(logInterceptor()) // 自定義需要攔截的和不需要攔截的 .addPathPatterns("/**") .excludePathPatterns("/test***.html"); } }

          經(jīng)過上述的幾個(gè)步驟,基本上就可以簡單的將同一次的業(yè)務(wù)調(diào)用鏈上的日志串聯(lián)起來了。

          2. 測試驗(yàn)證

          簡單的寫一個(gè)測試類:TestController.java

          less

          復(fù)制代碼

          @RestController @Slf4j public class TestController { @Resource(name="userService") private IUserService userService; @PostMapping("/test") public String testTrace01(@RequestParam("name") final String name) { log.info("入?yún)?name={}", name); testTrace02(); log.info("調(diào)用結(jié)束name={}", name); return "Hello," + name; } }

          使用Postman調(diào)用接口:http://localhost:8080/test?name=張三

          控制臺(tái)的輸出如下:

          至此,一個(gè)最簡單的日志串聯(lián)就做好了


          作者:Ethan
          鏈接:https://juejin.cn/post/7283418392957796389
          來源:稀土掘金
          著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

          者:東東 yasking

          來源:https://blog.yasking.org/a/python-logbook.html

          Python 本身有l(wèi)ogging日志記錄模塊,之前發(fā)現(xiàn)了logbook這個(gè)包,介紹說是替代logging,索性整理一下,方便之后使用

          1. >>> from logbook import Logger, StreamHandler

          2. >>> import sys

          3. >>> StreamHandler(sys.stdout).push_application

          4. >>> log=Logger('Logbook')

          5. >>> log.info('Hello, World!')

          6. [2015-10-05 18:55:56.937141] INFO: Logbook: Hello, World!

          上邊這是文檔中給出的例子,它定義了許多的Handler,可以把日志記錄到標(biāo)準(zhǔn)輸出,文件,E-MAIL,甚至Twitter

          StreamHandler

          使用 StreamHandler記錄的日志會(huì)以流輸出,這里指定sys.stdout也就是記錄到標(biāo)準(zhǔn)輸出,與print一樣

          (一)可以使用 with來在一定作用域內(nèi)記錄日志

          1. # -*- coding: utf-8 -*-

          2. from logbook import Logger, StreamHandler

          3. import logbook

          4. import sys

          5. handler=StreamHandler(sys.stdout)

          6. log=Logger('test')

          7. def main:

          8. log.info('something logging')

          9. if __name__=='__main__':

          10. with handler.applicationbound:

          11. main

          (二)也可以指定作用于整個(gè)應(yīng)用

          1. # -*- coding: utf-8 -*-

          2. from logbook import Logger, StreamHandler

          3. import logbook

          4. import sys

          5. handler=StreamHandler(sys.stdout)

          6. handler.push_application

          7. log=Logger('test')

          8. def main:

          9. log.info('something logging')

          10. if __name__=='__main__':

          11. main

          FileHandler

          使用 FileHandler可以把日志記錄到文件,這也是最常見的方式

          1. # -*- coding: utf-8 -*-

          2. from logbook import Logger, FileHandler

          3. import logbook

          4. import sys

          5. handler=FileHandler('app.log')

          6. handler.push_application

          7. log=Logger('test')

          8. def main:

          9. log.info('something logging')

          10. if __name__=='__main__':

          11. main

          日志就寫到了 app.log文件

          同時(shí)輸出到文件與STDOUT

          同時(shí)把記錄輸出到多個(gè)地方可以方便查閱和記錄,初始化 Handler的時(shí)候設(shè)置bubble參數(shù)就可以使得其它Handler也可以接收到記錄

          1. from logbook import Logger, StreamHandler, FileHandler

          2. import logbook

          3. import sys

          4. '''

          5. 記錄日志到文件和STDOUT

          6. '''

          7. StreamHandler(sys.stdout, level='DEBUG').push_application

          8. FileHandler('app.log', bubble=True, level='INFO').push_application

          9. log=Logger('test')

          10. def main:

          11. log.info('hello world')

          12. if __name__=='__main__':

          13. main

          另外,通過 level可以設(shè)置日志級(jí)別,級(jí)別如下,從下到上級(jí)別越來越高,如level設(shè)置為INFO, 則除了DEBUG外都會(huì)記錄,設(shè)置不同的級(jí)別,搭配各種Handler可以讓日志的記錄更加靈活,上邊使用的log.info可以使用不同的記錄級(jí)別

          級(jí)別說明
          critical嚴(yán)重錯(cuò)誤,需要退出程序
          error錯(cuò)誤,但在可控范圍內(nèi)
          warning警告
          notice大多數(shù)情況下希望看到的記錄
          info大多數(shù)情況不希望看到的記錄
          debug調(diào)試程序的時(shí)候詳細(xì)輸出的記錄

          MailHandler

          和日志文件同樣重要的就是 MailHandler了,當(dāng)出現(xiàn)了比較嚴(yán)重錯(cuò)誤的時(shí)候就要發(fā)送郵寄進(jìn)行通知

          詳細(xì)的文檔見:

          分別使用了 163qq郵箱發(fā)送郵件測試,使用的郵箱需要開啟SMTP權(quán)限,代碼如下(163和qq發(fā)送參數(shù)稍有不同)

          163 Mail

          1. # -*- coding: utf-8 -*-

          2. from logbook import Logger, MailHandler

          3. import logbook

          4. import sys

          5. sender='Logger'

          6. recipients=['dongdong@qq.com']

          7. email_user='dongdong@163.com'

          8. email_pass='password'

          9. mail_handler=MailHandler(sender, recipients,

          10. server_addr='smtp.163.com',

          11. starttls=True,

          12. secure=False,

          13. credentials=(email_user, email_pass),

          14. format_string=u'''

          15. Subject: {record.level_name} on My Application

          16. Message type: {record.level_name}

          17. Location: {record.filename}:{record.lineno}

          18. Module: {record.module}

          19. Function: {record.func_name}

          20. Time: {record.time:%Y-%m-%d %H:%M:%S}

          21. Remote IP: {record.extra[ip]}

          22. Request: {record.extra[url]} [{record.extra[method]}]

          23. Message: {record.message}

          24. ''',

          25. bubble=True)

          26. log=Logger('test')

          27. def main:

          28. log.info('something logging')

          29. if __name__=='__main__':

          30. with mail_handler.threadbound:

          31. main

          QQ Mail

          1. # -*- coding: utf-8 -*-

          2. from logbook import Logger, MailHandler

          3. import logbook

          4. import sys

          5. sender='Logger'

          6. recipients=['dongdong@163.com']

          7. email_user='dongdong@qq.com'

          8. email_pass='password'

          9. mail_handler=MailHandler(sender, recipients,

          10. server_addr='smtp.qq.com',

          11. starttls=False,

          12. secure=True,

          13. credentials=(email_user, email_pass),

          14. format_string=u'''

          15. Subject: {record.level_name} on My Application

          16. Message type: {record.level_name}

          17. Location: {record.filename}:{record.lineno}

          18. Module: {record.module}

          19. Function: {record.func_name}

          20. Time: {record.time:%Y-%m-%d %H:%M:%S}

          21. Remote IP: {record.extra[ip]}

          22. Request: {record.extra[url]} [{record.extra[method]}]

          23. Message: {record.message}

          24. ''',

          25. bubble=True)

          26. log=Logger('test')

          27. def main:

          28. log.info('something logging')

          29. if __name__=='__main__':

          30. with mail_handler.threadbound:

          31. main

          內(nèi)容 format_string中的用大括號(hào)的會(huì)進(jìn)行數(shù)值替換,Subject字段上邊的``和下邊需要空一行,這樣解析參數(shù)收到的郵件才會(huì)正確的顯示標(biāo)題

          Record Processors

          上邊發(fā)送郵件的例子,參數(shù)里面有一個(gè) record.extra[url],這個(gè)參數(shù)是可以自己指定的,比如編寫WSGI的程序,處理URL,每一條記錄都希望記錄到訪問者的IP,可以這樣做:

          1. # -*- coding: utf-8 -*-

          2. from logbook import Logger, StreamHandler, Processor

          3. import logbook

          4. import sys

          5. handler=StreamHandler(sys.stdout)

          6. handler.format_string='[{{record.time:%Y-%m-%d %H:%M:%S}}] IP:{record.extra[ip]} {record.level_name}: {record.channel}: {record.message}'

          7. handler.formatter

          8. log=Logger('test')

          9. def inject_ip(record):

          10. record.extra['ip']='127.0.0.1'

          11. with handler.applicationbound:

          12. with Processor(inject_ip).applicationbound:

          13. log.error('something error')

          使用自定義參數(shù),需要重新設(shè)置 format_string,才能進(jìn)行記錄,record類可以在這里找到,詳細(xì)參數(shù)見logbook.LogRecord

          Output:

          1. [2016-12-13 12:20:46] IP:127.0.0.1 ERROR: test: something error

          日期格式

          上邊在介紹的自定義日志格式的時(shí)候使用的時(shí)間是雖然指定了格式但是是 UTC格式,跟北京時(shí)間是差了8個(gè)小時(shí)的。所以需要設(shè)置讓它記錄本地的時(shí)間

          在剛才的例子前面加上如下代碼即可

          1. logbook.set_datetime_format('local') # <=新加入行

          2. handler=StreamHandler(sys.stdout)

          3. handler.format_string='[{record.time:%Y-%m-%d %H:%M:%S}] IP:{record.extra[ip]} {record.level_name}: {record.channel}: {record.message}'

          4. handler.formatter

          更過日期格式化的設(shè)置參看:api/utilities - logbook.set_datetime_format(datetime_format)

          threadbound與applicationbound

          從最開始的例子來看,可以使用兩種方式來記錄日志,一種是在最開始使用 push_*來激活,另一種是使用的時(shí)候用with構(gòu)造上下文,現(xiàn)在進(jìn)行一些補(bǔ)充

          pushwithpop
          push_applicationapplicationboundpop_application
          push_threadthreadboundpop_threadbound
          push_greenletgreenletboundpop_greenlet
          • 使用 pop_*可以取消記錄的上下文

          • application作用于整個(gè)應(yīng)用,thread只針對(duì)當(dāng)前線程

          1. handler=MyHandler

          2. handler.push_application

          3. # all here goes to that handler

          4. handler.pop_application

          消除嵌套

          使用多個(gè)Handler的時(shí)候,使用 push_方式啟動(dòng)的上下文不會(huì)形成嵌套,但是使用with啟動(dòng)的上下文會(huì)形成嵌套,可以使用nested handler

          1. import os

          2. from logbook import NestedSetup, Handler, FileHandler,

          3. MailHandler, Processor

          4. def inject_information(record):

          5. record.extra['cwd']=os.getcwd

          6. setup=NestedSetup([

          7. # Handler避免stderr接受消息

          8. Handler(),

          9. FileHandler('application.log', level='WARNING'),

          10. MailHandler('servererrors@example.com', ['admin@example.com'],

          11. level='ERROR', bubble=True),

          12. Processor(inject_information)

          13. ])

          使用的時(shí)候就只需要一個(gè) with來啟動(dòng)

          1. with setup.threadbound:

          2. log.info('something logging')

          logbook是個(gè)不錯(cuò)的包,記錄日志靈活方便,比自己包裝發(fā)送郵件方便了不少,整理了一些基本用法,還有不少值得學(xué)習(xí)的功能,暫時(shí)能用到的基本上就這么多,之后用到高級(jí)的功能再繼續(xù)研究補(bǔ)充。

          題圖:pexels,CC0 授權(quán)。


          主站蜘蛛池模板: 日本一区二区三区在线看| 日韩人妻无码免费视频一区二区三区 | 久久精品一区二区| 国产福利无码一区在线| 中文字幕一区二区三区视频在线| 2020天堂中文字幕一区在线观| 精品国产毛片一区二区无码| 欧亚精品一区三区免费| 日韩一区二区三区四区不卡| 日本一区二区三区在线观看| 国产在线一区二区三区av| 亚洲欧洲无码一区二区三区| 久久久久人妻精品一区| 熟女精品视频一区二区三区| 在线视频一区二区三区三区不卡| 亚洲成av人片一区二区三区| 在线播放精品一区二区啪视频| 亚洲丰满熟女一区二区v| 中文字幕日韩一区二区三区不卡| 91精品一区国产高清在线| 一区二区三区中文| 国产在线精品一区免费香蕉| 人妻免费一区二区三区最新| 国产成人无码一区二区三区在线| 国产福利电影一区二区三区| 中文字幕一区在线播放| 亚洲av无码天堂一区二区三区| 亚洲AⅤ无码一区二区三区在线| 国产vr一区二区在线观看| 精品人妻少妇一区二区| 综合人妻久久一区二区精品| 无码午夜人妻一区二区三区不卡视频| 日韩精品无码视频一区二区蜜桃 | 亚洲美女一区二区三区| 国产大秀视频在线一区二区| 91视频一区二区三区| 日韩精品一区二区三区中文3d | 国产精品99无码一区二区| 中文字幕一区二区三区免费视频| 亚洲老妈激情一区二区三区| 色一乱一伦一图一区二区精品|