精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

從Slf4j源碼角度分析阿里開發手冊日志規約

開發 前端
《阿里巴巴開發手冊》日志規約章節有一條強制規定:應用中不可直接使用日志系統(Log4j、Logback)API,而應依賴使用日志框架SLF4J中的API。

[[387472]]

本文轉載自微信公眾號「JAVA前線」,作者IT徐胖子 。轉載本文請聯系JAVA前線公眾號。

 1 日志規約

《阿里巴巴開發手冊》日志規約章節有一條強制規定:應用中不可直接使用日志系統(Log4j、Logback)API,而應依賴使用日志框架SLF4J中的API。使用門面模式的日志框架,有利于維護和各個類的日志處理方式統一:

  1. import org.slf4j.Logger; 
  2. import org.slf4j.LoggerFactory; 
  3. private static final Logger logger = LoggerFactory.getLogger(Abc.class); 

我們在使用日志框架過程中會發現,日志框架種類很多如slf4j、log4j、logback等等,在引入依賴時很容易混淆。那么這些框架是什么關系、應該如何使用就是本文需要回答的問題。

2 實例分析

在編寫代碼之前我們首先了解slf4j全稱,我認為這會對理解這個框架有所幫助:

  1. Simple Logging Facade for Java 

全稱的含義就是Java簡單日志門面,我們知道有一種設計模式被稱為門面模式,其本質是化零為整,通過一個對象將散落在各處的功能整合在一起,這樣外部只要通過與這個對象交互,由該對象選擇具體實現細節。slf4j就是這樣一個門面,應用程序只需要和slf4j進行交互,slf4j選擇使用哪一個日志框架的具體實現。

2.1 slf4j-jdk14

(1) 引入依賴

  1. <dependencies> 
  2.   <!-- slf4j --> 
  3.   <dependency> 
  4.     <groupId>org.slf4j</groupId> 
  5.     <artifactId>slf4j-api</artifactId> 
  6.     <version>1.7.30</version> 
  7.   </dependency> 
  8.    
  9.   <!-- jdk14 --> 
  10.   <dependency> 
  11.     <groupId>org.slf4j</groupId> 
  12.     <artifactId>slf4j-jdk14</artifactId> 
  13.     <version>1.7.30</version> 
  14.   </dependency> 
  15. </dependencies> 

 

 

(2) 代碼實例

  1. import org.slf4j.Logger; 
  2. import org.slf4j.LoggerFactory; 
  3.  
  4. public class LogTest { 
  5.     private final static Logger logger = LoggerFactory.getLogger(LogTest.class); 
  6.     public static void main(String[] args) { 
  7.         logger.info("info message"); 
  8.         System.out.println("LogTest"); 
  9.         logger.error("error message"); 
  10.     } 

(3) 輸出日志

  1. LogTest 
  2. 三月 14, 2021 11:39:14 上午 com.my.log.test.jdk14.LogTest main 
  3. 信息: info message 
  4. 三月 14, 2021 11:39:14 上午 com.my.log.test.jdk14.LogTest main 
  5. 嚴重: error message 

2.2 slf4j-simple

(1) 引入依賴

  1. <dependencies> 
  2.   <!-- slf4j --> 
  3.   <dependency> 
  4.     <groupId>org.slf4j</groupId> 
  5.     <artifactId>slf4j-api</artifactId> 
  6.     <version>1.7.30</version> 
  7.   </dependency> 
  8.    
  9.   <!-- simple --> 
  10.   <dependency> 
  11.     <groupId>org.slf4j</groupId> 
  12.     <artifactId>slf4j-simple</artifactId> 
  13.     <version>1.7.30</version> 
  14.   </dependency> 
  15. </dependencies> 

 

 

(2) 代碼實例

  1. import org.slf4j.Logger; 
  2. import org.slf4j.LoggerFactory; 
  3.  
  4. public class LogTest { 
  5.     private final static Logger logger = LoggerFactory.getLogger(LogTest.class); 
  6.     public static void main(String[] args) { 
  7.         logger.info("info message"); 
  8.         System.out.println("LogTest"); 
  9.         logger.error("error message"); 
  10.     } 

(3) 輸出日志

  1. [main] INFO com.my.log.test.simple.LogTest - info message 
  2. LogTest 
  3. [main] ERROR com.my.log.test.simple.LogTest - error message 

2.3 logback

(1) 引入依賴

  1. <dependencies> 
  2.   <!-- slf4j --> 
  3.   <dependency> 
  4.     <groupId>org.slf4j</groupId> 
  5.     <artifactId>slf4j-api</artifactId> 
  6.     <version>1.7.30</version> 
  7.   </dependency> 
  8.    
  9.   <!-- logback --> 
  10.   <dependency> 
  11.     <groupId>ch.qos.logback</groupId> 
  12.     <artifactId>logback-core</artifactId> 
  13.     <version>1.2.3</version> 
  14.   </dependency> 
  15.   <dependency> 
  16.     <groupId>ch.qos.logback</groupId> 
  17.     <artifactId>logback-classic</artifactId> 
  18.     <version>1.2.3</version> 
  19.   </dependency> 
  20. </dependencies> 

 

 

(2) 代碼實例

  1. import org.slf4j.Logger; 
  2. import org.slf4j.LoggerFactory; 
  3.  
  4. public class LogTest { 
  5.     private final static Logger logger = LoggerFactory.getLogger(LogTest.class); 
  6.     public static void main(String[] args) { 
  7.         logger.info("info message"); 
  8.         System.out.println("LogTest"); 
  9.         logger.error("error message"); 
  10.     } 

(3) 輸出日志

  1. 11:40:53.406 [main] INFO com.my.log.test.logbck.LogTest - info message 
  2. LogTest 
  3. 11:40:53.410 [main] ERROR com.my.log.test.logbck.LogTest - error message 

2.4 slf4j-log4j12

(1) 引入依賴

  1. <dependencies> 
  2.   <!-- slf4j --> 
  3.   <dependency> 
  4.     <groupId>org.slf4j</groupId> 
  5.     <artifactId>slf4j-api</artifactId> 
  6.     <version>1.7.30</version> 
  7.   </dependency> 
  8.    
  9.   <!-- log4j12 --> 
  10.   <dependency> 
  11.     <groupId>org.slf4j</groupId> 
  12.     <artifactId>slf4j-log4j12</artifactId> 
  13.     <version>1.7.30</version> 
  14.   </dependency> 
  15. </dependencies> 

 

 

(2) 代碼實例

  1. import org.slf4j.Logger; 
  2. import org.slf4j.LoggerFactory; 
  3.  
  4. public class LogTest { 
  5.     private final static Logger logger = LoggerFactory.getLogger(LogTest.class); 
  6.     public static void main(String[] args) { 
  7.         logger.info("info message"); 
  8.         System.out.println("LogTest"); 
  9.         logger.error("error message"); 
  10.     } 

(3) 日志配置

  1. <log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'
  2.   <appender name="myConsoleAppender" class="org.apache.log4j.ConsoleAppender"
  3.     <layout class="org.apache.log4j.PatternLayout"
  4.       <param name="ConversionPattern" value="[%d{dd HH:mm:ss,SSS\} %-5p] [%t] %c{2\} - %m%n" /> 
  5.     </layout> 
  6.     <!--過濾器設置輸出級別 --> 
  7.     <filter class="org.apache.log4j.varia.LevelRangeFilter"
  8.       <param name="levelMin" value="debug" /> 
  9.       <param name="levelMax" value="error" /> 
  10.       <param name="AcceptOnMatch" value="true" /> 
  11.     </filter> 
  12.   </appender> 
  13.   <root> 
  14.     <priority value="debug" /> 
  15.     <appender-ref ref="myConsoleAppender" /> 
  16.   </root> 
  17. </log4j:configuration> 

 

 

 

 

 

(4) 輸出日志

  1. [14 11:41:39,198 INFO ] [main] log4j.LogTest - info message 
  2. LogTest 
  3. [14 11:41:39,201 ERROR] [main] log4j.LogTest - error message 

3 源碼分析

我們發現上述實例中Java代碼并沒有變化,只是將引用具體日志框架實現進行了替換,例如依賴從simple替換為log4j,具體日志服務實現就替換成了log4j,這到底是怎么實現的?我們通過閱讀源碼回答這個問題。

3.1 閱讀準備

(1) 源碼地址

目前最新版本2.0.0-alpha2-SNAPSHOT

  1. https://github.com/qos-ch/slf4j 

(2) 項目結構

我們從項目結構可以看出一些信息:門面是api模塊,具體實現包括jdk14、log4j12、simple模塊,需要注意logback是同一個作者的另一個項目不在本項目。

(3) 閱讀入口

  1. package org.slf4j; 
  2.  
  3. public class NoBindingTest { 
  4.     public void testLogger() { 
  5.         Logger logger = LoggerFactory.getLogger(NoBindingTest.class); 
  6.         logger.debug("hello" + diff); 
  7.         assertTrue(logger instanceof NOPLogger); 
  8.     } 

3.2 源碼分析

LoggerFactory.getLogger

  1. public final class LoggerFactory { 
  2.     public static Logger getLogger(Class<?> clazz) { 
  3.         Logger logger = getLogger(clazz.getName()); 
  4.         if (DETECT_LOGGER_NAME_MISMATCH) { 
  5.             Class<?> autoComputedCallingClass = Util.getCallingClass(); 
  6.             if (autoComputedCallingClass != null && nonMatchingClasses(clazz, autoComputedCallingClass)) { 
  7.                 Util.report(String.format("Detected logger name mismatch. Given name: \"%s\"; computed name: \"%s\".", logger.getName(), 
  8.                                           autoComputedCallingClass.getName())); 
  9.                 Util.report("See " + LOGGER_NAME_MISMATCH_URL + " for an explanation"); 
  10.             } 
  11.         } 
  12.         return logger; 
  13.     } 

getLogger(clazz.getName())

  1. public final class LoggerFactory { 
  2.     public static Logger getLogger(String name) { 
  3.         ILoggerFactory iLoggerFactory = getILoggerFactory(); 
  4.         return iLoggerFactory.getLogger(name); 
  5.     } 

getILoggerFactory()

  1. public final class LoggerFactory { 
  2.     public static ILoggerFactory getILoggerFactory() { 
  3.         return getProvider().getLoggerFactory(); 
  4.     } 

getProvider()

  1. public final class LoggerFactory { 
  2.     static SLF4JServiceProvider getProvider() { 
  3.         if (INITIALIZATION_STATE == UNINITIALIZED) { 
  4.             synchronized (LoggerFactory.class) { 
  5.                 if (INITIALIZATION_STATE == UNINITIALIZED) { 
  6.                     INITIALIZATION_STATE = ONGOING_INITIALIZATION; 
  7.                     performInitialization(); 
  8.                 } 
  9.             } 
  10.         } 
  11.         switch (INITIALIZATION_STATE) { 
  12.         case SUCCESSFUL_INITIALIZATION: 
  13.             return PROVIDER; 
  14.         case NOP_FALLBACK_INITIALIZATION: 
  15.             return NOP_FALLBACK_FACTORY; 
  16.         case FAILED_INITIALIZATION: 
  17.             throw new IllegalStateException(UNSUCCESSFUL_INIT_MSG); 
  18.         case ONGOING_INITIALIZATION: 
  19.             return SUBST_PROVIDER; 
  20.         } 
  21.         throw new IllegalStateException("Unreachable code"); 
  22.     } 

performInitialization()

  1. public final class LoggerFactory { 
  2.     private final static void performInitialization() { 
  3.         bind(); 
  4.         if (INITIALIZATION_STATE == SUCCESSFUL_INITIALIZATION) { 
  5.             versionSanityCheck(); 
  6.         } 
  7.     } 

bind()

  1. public final class LoggerFactory { 
  2.     private final static void bind() { 
  3.         try { 
  4.             // 核心代碼 
  5.             List<SLF4JServiceProvider> providersList = findServiceProviders(); 
  6.             reportMultipleBindingAmbiguity(providersList); 
  7.             if (providersList != null && !providersList.isEmpty()) { 
  8.              PROVIDER = providersList.get(0); 
  9.              PROVIDER.initialize(); 
  10.              INITIALIZATION_STATE = SUCCESSFUL_INITIALIZATION; 
  11.                 reportActualBinding(providersList); 
  12.             } 
  13.             // 省略代碼 
  14.         } catch (Exception e) { 
  15.             failedBinding(e); 
  16.             throw new IllegalStateException("Unexpected initialization failure", e); 
  17.         } 
  18.     } 

findServiceProviders()

這是加載具體日志實現的核心方法,使用SPI機制加載所有SLF4JServiceProvider實現類:

  1. public final class LoggerFactory { 
  2.     private static List<SLF4JServiceProvider> findServiceProviders() { 
  3.         ServiceLoader<SLF4JServiceProvider> serviceLoader = ServiceLoader.load(SLF4JServiceProvider.class); 
  4.         List<SLF4JServiceProvider> providerList = new ArrayList<SLF4JServiceProvider>(); 
  5.         for (SLF4JServiceProvider provider : serviceLoader) { 
  6.             providerList.add(provider); 
  7.         } 
  8.         return providerList; 
  9.     } 

SPI(Service Provider Interface)是一種服務發現機制,本質是將接口實現類的全限定名配置在文件中,并由服務加載器讀取配置文件加載實現類,這樣可以在運行時動態為接口替換實現類,通過SPI機制可以為程序提供拓展功能。本文以log4j為例說明使用SPI功能的三個步驟:

(a) 實現接口

  1. public class Log4j12ServiceProvider implements SLF4JServiceProvider 

(b) 配置文件

  1. 文件位置:src/main/resources/META-INF/services/ 
  2. 文件名稱:org.slf4j.spi.SLF4JServiceProvider 
  3. 文件內容:org.slf4j.log4j12.Log4j12ServiceProvider 

(c) 服務加載

  1. public final class LoggerFactory { 
  2.     private static List<SLF4JServiceProvider> findServiceProviders() { 
  3.         ServiceLoader<SLF4JServiceProvider> serviceLoader = ServiceLoader.load(SLF4JServiceProvider.class); 
  4.         List<SLF4JServiceProvider> providerList = new ArrayList<SLF4JServiceProvider>(); 
  5.         for (SLF4JServiceProvider provider : serviceLoader) { 
  6.             providerList.add(provider); 
  7.         } 
  8.         return providerList; 
  9.     } 

只要各種日志實現框架按照SPI約定進行代碼編寫和配置文件聲明,即可以被LoggerFactory加載,slf4j會獲取第一個作為實現。

  1. public final class LoggerFactory { 
  2.     private final static void bind() { 
  3.         try { 
  4.             // 使用SPI機制加載具體日志實現 
  5.             List<SLF4JServiceProvider> providersList = findServiceProviders(); 
  6.             reportMultipleBindingAmbiguity(providersList); 
  7.             if (providersList != null && !providersList.isEmpty()) { 
  8.                 // 獲取第一個實現 
  9.                 PROVIDER = providersList.get(0); 
  10.                 PROVIDER.initialize(); 
  11.                 INITIALIZATION_STATE = SUCCESSFUL_INITIALIZATION; 
  12.                 reportActualBinding(providersList); 
  13.             } 
  14.             // 省略代碼 
  15.         } catch (Exception e) { 
  16.             failedBinding(e); 
  17.             throw new IllegalStateException("Unexpected initialization failure", e); 
  18.         } 
  19.     } 

分析到這里我們的問題應該可以得到解答:假設我們項目只引入了slf4j和log4j,相當于只有log4j這一個具體實現,那么本項目就會使用log4j框架。如果將log4j依賴換為logback,那么項目在不改動代碼的情況下會使用logback框架。

4 文章總結

本文我們從阿里開發手冊日志規約出發,首先分析了如何使用不同的日志框架,然后我們從問題出發(不修改代碼即可替換具體日志框架)進行slf4j源碼閱讀,從源碼中我們知道實現核心是SPI機制,這個機制可以動態加載具體日志實現。關于SPI源碼分析請參看筆者文章JDK SPI機制,希望本文對大家有所幫助。

 

責任編輯:武曉燕 來源: JAVA前線
相關推薦

2023-01-11 21:22:32

Java服務器

2024-03-01 16:52:02

SLF4J日志框架

2023-10-28 16:19:18

Android日志

2013-02-20 09:42:34

JavaLogbackSLF4J

2020-01-07 10:06:26

Slf4jLog4JLogback

2020-10-27 08:24:45

阿里巴巴SLF4J

2016-10-21 13:10:18

javalog4jslf4j

2024-03-01 08:17:28

SLF4J日志框架

2023-10-07 10:08:54

2017-05-02 21:14:20

阿里巴巴Java開發

2025-05-26 08:50:00

SLF4JMDC全鏈路追蹤

2025-01-20 08:10:00

微服務架構SLF4J

2020-12-14 08:03:52

ArrayList面試源碼

2020-12-17 08:03:57

LinkedList面試源碼

2025-10-10 04:10:00

2020-11-04 12:33:08

Log4j 2日志Logback

2023-05-06 07:51:22

JavaFacade設計模式

2022-12-30 08:31:27

MDC查詢日志

2021-08-02 15:40:20

Java日志工具

2021-12-30 08:55:41

Log4j2FastJson漏洞
點贊
收藏

51CTO技術棧公眾號

超碰caoprom| 韩国一区二区三区美女美女秀| 女同久久另类69精品国产| 欧美日韩中出| 精品欧美国产一区二区三区| 午夜精品福利一区二区| 精品国产九九九| 亚洲在线成人| 久久夜色撩人精品| 少妇毛片一区二区三区| 国产绳艺sm调教室论坛| 欧美高清一区| 亚洲欧美精品伊人久久| 国产大片一区二区三区| 乱馆动漫1~6集在线观看| 国产精品色噜噜| 韩国精品一区二区三区六区色诱| 一级特黄aaa大片| 99精品免费| 久久久精品一区二区| 黄色在线观看av| 欧美影院视频| 欧美日免费三级在线| 欧美大片在线播放| 在线观看的网站你懂的| 欧美激情综合五月色丁香小说| 成人久久久久久| 欧美亚洲另类小说| 亚洲日本国产| 欧美激情一区二区久久久| 欧美性生给视频| 国产精品免费99久久久| 亚洲精品国偷自产在线99热| 日本精品一二三| 成人在线日韩| 欧美精品高清视频| 久久99999| 欧美性猛交xxx高清大费中文| 午夜视频一区二区| 欧美黄色免费网址| 99福利在线| 亚洲视频一区在线| 亚洲啪啪av| 国产视频第一区| 久久综合一区二区| 久久久久se| 亚洲色图狠狠干| 成人av资源在线| 国产精品国产三级国产专区53 | 日韩午夜高潮| 欧美精品久久一区二区| 欧美精品一区二区成人| 午夜国产精品视频免费体验区| 北条麻妃久久精品| 九九热久久免费视频| 欧美亚洲国产一区| 最新的欧美黄色| 日本视频在线免费| 亚洲精品久久| 欧美日韩国产成人在线| 免费在线黄色片| 激情久久久久久| 亚洲91精品在线| 国产午夜激情视频| 亚洲精品日本| 国产成人精品免费久久久久 | 日韩vs国产vs欧美| 国产精品视频在线观看| 亚洲系列在线观看| 国产精品自拍毛片| 国产精选一区二区| 女人偷人在线视频| 国产精品免费丝袜| 大陆极品少妇内射aaaaaa| 视频在线观看入口黄最新永久免费国产| 自拍视频在线观看一区二区| 日韩a级黄色片| 老牛影视精品| 欧美日韩久久一区| 9191在线视频| 网红女主播少妇精品视频| 亚洲欧洲偷拍精品| 日本中文在线视频| 亚洲高清激情| 日韩美女主播视频| 一级特黄aa大片| 成人app下载| 亚洲精品成人三区| 牛牛精品在线视频| 日本道在线观看一区二区| 午夜视频在线网站| 欧美理伦片在线播放| 一区二区三欧美| 免费在线视频一区二区| 久久久青草婷婷精品综合日韩| 国产在线高清精品| 四虎成人免费在线| 国产精品大尺度| 蜜桃传媒一区二区三区| 黑人一区二区三区| 欧美精品一区二区三区在线| 九一在线免费观看| 99热免费精品在线观看| 国产欧美精品一区二区三区介绍| 性欧美8khd高清极品| 国产日韩欧美综合在线| 加勒比成人在线| 久久影视精品| 精品一区电影国产| 欧美片一区二区| 全国精品久久少妇| 久久综合婷婷综合| a篇片在线观看网站| 在线看日韩精品电影| 亚洲精品无码一区二区| 围产精品久久久久久久| 日本韩国在线不卡| 人妻无码一区二区三区久久99| 国产精品久久久久久久久动漫 | 97在线视频免费观看完整版| 欧美日韩久久久久久| 中文字幕一区二区人妻在线不卡| 欧美激情第二页| 国产在线一区二区三区| 久青草国产在线| 高跟丝袜欧美一区| 蜜臀av粉嫩av懂色av| 一本一本久久a久久综合精品| 国产精品96久久久久久| 丝袜视频国产在线播放| 天天色 色综合| 国产精品熟妇一区二区三区四区 | 国产 福利 在线| caoporn成人免费视频在线| 久久精品久久久久久国产 免费| 日韩在线视频不卡| 91在线精品一区二区| 欧美一级视频在线播放| 岛国精品一区| 久久久噜噜噜久久久| 亚洲av无码一区二区乱子伦| 亚洲欧洲中文日韩久久av乱码| 亚洲xxx在线观看| 久久精品国产亚洲夜色av网站| 国产精品成人aaaaa网站| 激情小视频在线| 欧美在线免费观看视频| 一区二区黄色片| 久久久xxx| 青娱乐一区二区| 免费观看一级欧美片| 亚洲毛片在线免费观看| 免费黄色片视频| 欧美极品aⅴ影院| www.精品在线| 91精品啪在线观看国产18| 成人天堂噜噜噜| av在线free| 精品国内二区三区| 在线能看的av| 国产色综合一区| 中文字幕第88页| 一区二区三区毛片免费| 国产精品久久久久久久久久久久午夜片 | 亚洲精品午夜av福利久久蜜桃| 成人午夜激情免费视频| 性欧美video高清bbw| 精品国产不卡一区二区三区| 日本一级一片免费视频| 久久午夜老司机| 邪恶网站在线观看| 亚洲中无吗在线| 国产精品一区二区免费| 日韩av中字| 久久九九精品99国产精品| 午夜久久久久久久久久| 日韩欧美国产网站| 亚洲综合久久av一区二区三区| 韩国女主播成人在线| 日韩人妻无码精品久久久不卡| 国产精品最新| 亚洲一区制服诱惑| 日韩脚交footjobhd| 最近2019中文字幕第三页视频| 国产黄色大片网站| 欧美性xxxx在线播放| 黄色一级片一级片| 成人黄色网址在线观看| 久久久久免费精品| 欧美三级乱码| 奇米精品在线| 97se亚洲| 国产精品视频一区二区三区四| 色婷婷av在线| 在线播放日韩av| 成人午夜免费在线观看| 欧美视频在线一区| 中文在线观看免费网站| 国产精品久久免费看| 成年人的黄色片| 国产一区二区在线影院| 日本在线观看a| 在线观看日韩| 五月天色一区| 欧美激情影院| 91久久精品国产91久久性色tv| 成人做爰视频www网站小优视频| 色综合天天狠天天透天天伊人| 加勒比一区二区三区在线| 亚洲国产精品电影| 国产又粗又猛又爽又黄91| 日韩欧美亚洲成人| 久久这里只有精品免费| 国产精品久久二区二区| aa片在线观看视频在线播放| 国产精品一区二区三区乱码| 天天色综合天天色| 午夜一区二区三区不卡视频| 日本福利视频一区| 伊人久久大香线蕉精品组织观看| 日韩欧美第二区在线观看| 老司机精品在线| 动漫3d精品一区二区三区 | 7777精品伊人久久久大香线蕉超级流畅| 日韩美女黄色片| 一区二区三区波多野结衣在线观看 | www.国产精品一区| 99电影在线观看| 久久69av| 成人免费xxxxx在线观看| 亚洲精品.com| 青青草一区二区| 神马午夜在线视频| 91国产精品视频在线| 成人三级高清视频在线看| 欧美黑人国产人伦爽爽爽| 在线观看午夜av| 欧美日本黄视频| 中文字幕伦理免费在线视频| 久久精品国产亚洲精品| 美女黄视频在线观看| 日韩亚洲国产中文字幕| 黄色免费在线网站| 不卡av在线播放| 最新av在线播放| 久99久在线视频| 日本在线观看大片免费视频| 九九热这里只有精品6| 性欧美ⅴideo另类hd| 久久久久国产精品免费| 后进极品白嫩翘臀在线播放| 久久久久久久久91| 欧美巨大丰满猛性社交| 91超碰caoporn97人人| 英国三级经典在线观看| 日韩av手机在线| www.一区| 91日本在线观看| 91精品丝袜国产高跟在线| 国产精品久久久久久久天堂第1集| 99a精品视频在线观看| 精品国产一区二区三区麻豆小说| 亚洲动漫在线观看| 亚洲一区二区三区在线观看视频| 欧美残忍xxxx极端| 日本中文字幕在线视频观看| 国产一区二区三区的电影 | 国产日韩欧美一区二区三区乱码 | 精品欧美国产| 欧美日韩老妇| 中文字幕乱码免费| 国产一区91| 欧美成人三级在线播放| 国产成人亚洲精品狼色在线 | 精品国自产在线观看| 亚洲国产精品久久久久秋霞蜜臀 | 真实乱偷全部视频| 国产精品一品视频| 人人妻人人澡人人爽人人精品 | 东方aⅴ免费观看久久av| 好吊一区二区三区视频| 中文字幕国产精品一区二区| 久久免费视频播放| 91黄视频在线| 精品人妻久久久久一区二区三区 | 日本老熟俱乐部h0930| 精品久久久久久中文字幕大豆网| 高潮无码精品色欲av午夜福利| 日韩欧美国产精品| 国产在线视频你懂得| 久久国产精品久久久久久久久久| 625成人欧美午夜电影| 国产在线精品自拍| 伊人久久综合影院| 久久香蕉视频网站| 轻轻草成人在线| 国产精品成人无码专区| 亚洲色图制服丝袜| 无码人妻黑人中文字幕| 精品少妇一区二区| 日日夜夜精品一区| 青青草原成人在线视频| 亚洲一区 二区| 一区二区精品在线| 亚洲在线电影| 超碰caoprom| 综合精品久久久| 中文字幕av影视| 精品丝袜一区二区三区| 亚洲色图美国十次| 91精品久久久久| 欧美精品乱码| 日韩av一二三四区| 成人美女视频在线观看18| 国产免费久久久久| 欧美日韩中文字幕一区二区| 神马精品久久| 高清欧美性猛交xxxx黑人猛交| 99久久久成人国产精品| 日韩视频在线观看国产| 欧美资源在线| 青青草视频成人| 偷窥国产亚洲免费视频| 狠狠躁日日躁夜夜躁av| 欧美区在线播放| 精品一区二区三区亚洲| 亚洲一区二区免费视频软件合集| 三级精品在线观看| 18禁裸乳无遮挡啪啪无码免费| 香蕉av福利精品导航| 亚洲国产精品成人久久蜜臀| 欧美床上激情在线观看| 95精品视频| 色香蕉在线观看| 国产在线观看免费一区| 女同久久另类69精品国产| 欧美日韩小视频| 日本中文字幕在线2020| 国产一区香蕉久久| 亚洲精品a级片| 一个人看的视频www| 亚洲精品视频免费看| www香蕉视频| 九九热最新视频//这里只有精品| 欧美日本三级| 男人添女荫道口女人有什么感觉| 丁香婷婷综合色啪| 国产无遮挡裸体免费视频| 亚洲第一中文字幕| 在线观看特色大片免费视频| 麻豆91av| 蜜臀av在线播放一区二区三区| 欧美88888| 日韩一区二区三区观看| 国产丝袜视频在线播放| 久久riav| 免费欧美日韩国产三级电影| 国产精品一区二区亚洲| 欧美一区二区三区系列电影| 欧美激情成人动漫| 久久资源av| 美女精品自拍一二三四| 日本在线一级片| 亚洲第五色综合网| 欧洲av一区二区| 在线观看污视频| 99精品一区二区三区| 成人午夜精品视频| 免费av在线一区| 欧美变态挠脚心| 中文字幕天天干| 亚洲一区在线观看免费| 青青草视频在线观看| 国产综合色香蕉精品| 国产在线欧美| 中文字幕在线1| 欧美一三区三区四区免费在线看| xxxx视频在线| 亚洲高清视频一区二区| 国产白丝精品91爽爽久久| 久久国产精品免费看| 丝袜美腿精品国产二区| 久草精品视频| 污版视频在线观看| 亚洲国产精品久久久久婷婷884| 美女做暖暖视频免费在线观看全部网址91 | 亚洲 欧美 中文字幕| 久久精品亚洲一区| 日韩极品少妇| 亚洲热在线视频| 色综合一区二区三区| 99福利在线| 日本日本精品二区免费| 国产sm精品调教视频网站| www.久久网| 国产69精品久久久久9999| 999久久久国产精品| 亚洲av无码国产精品久久| 日韩美女主播在线视频一区二区三区 | 人人爽人人爽av|