久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

Java日志框架之logback使用詳解

瀏覽:2日期:2022-08-27 16:42:28

為什么使用logback

記得前幾年工作的時候,公司使用的日志框架還是log4j,大約從16年中到現(xiàn)在,不管是我參與的別人已經(jīng)搭建好的項目還是我自己主導的項目,日志框架基本都換成了logback,總結一下,logback大約有以下的一些優(yōu)點:

內(nèi)核重寫、測試充分、初始化內(nèi)存加載更小,這一切讓logback性能和log4j相比有諸多倍的提升 logback非常自然地直接實現(xiàn)了slf4j,這個嚴格來說算不上優(yōu)點,只是這樣,再理解slf4j的前提下會很容易理解logback,也同時很容易用其他日志框架替換logback logback有比較齊全的200多頁的文檔 logback當配置文件修改了,支持自動重新加載配置文件,掃描過程快且安全,它并不需要另外創(chuàng)建一個掃描線程 支持自動去除舊的日志文件,可以控制已經(jīng)產(chǎn)生日志文件的最大數(shù)量

總而言之,如果大家的項目里面需要選擇一個日志框架,那么我個人非常建議使用logback。

logback加載

我們簡單分析一下logback加載過程,當我們使用logback-classic.jar時,應用啟動,那么logback會按照如下順序進行掃描:

在系統(tǒng)配置文件System Properties中尋找是否有l(wèi)ogback.configurationFile對應的value 在classpath下尋找是否有l(wèi)ogback.groovy(即logback支持groovy與xml兩種配置方式) 在classpath下尋找是否有l(wèi)ogback-test.xml 在classpath下尋找是否有l(wèi)ogback.xml

以上任何一項找到了,就不進行后續(xù)掃描,按照對應的配置進行l(wèi)ogback的初始化,具體代碼實現(xiàn)可見ch.qos.logback.classic.util.ContextInitializer類的findURLOfDefaultConfigurationFile方法。

當所有以上四項都找不到的情況下,logback會調(diào)用ch.qos.logback.classic.BasicConfigurator的configure方法,構造一個ConsoleAppender用于向控制臺輸出日志,默認日志輸出格式為'%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n'。

logback的configuration

logback的重點應當是Appender、Logger、Pattern,在這之前先簡單了解一下logback的<configuration>,<configuration>只有三個屬性:

scan:當scan被設置為true時,當配置文件發(fā)生改變,將會被重新加載,默認為true scanPeriod:檢測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認為毫秒,當scan=true時這個值生效,默認時間間隔為1分鐘 debug:當被設置為true時,將打印出logback內(nèi)部日志信息,實時查看logback運行信息,默認為false

<logger>與<root>

先從最基本的<logger>與<root>開始。

<logger>用來設置某一個包或者具體某一個類的日志打印級別、以及指定<appender>。<logger>可以包含零個或者多個<appender-ref>元素,標識這個appender將會添加到這個logger。<logger>僅有一個name屬性、一個可選的level屬性和一個可選的additivity屬性:

name:用來指定受此logger約束的某一個包或者具體的某一個類 level:用來設置打印級別,五個常用打印級別從低至高依次為TRACE、DEBUG、INFO、WARN、ERROR,如果未設置此級別,那么當前l(fā)ogger會繼承上級的級別 additivity:是否向上級logger傳遞打印信息,默認為true

<root>也是<logger>元素,但是它是根logger,只有一個level屬性,因為它的name就是ROOT,關于這個地方,有朋友微信上問起,源碼在LoggerContext中:

public LoggerContext() { super(); this.loggerCache = new ConcurrentHashMap<String, Logger>(); this.loggerContextRemoteView = new LoggerContextVO(this); this.root = new Logger(Logger.ROOT_LOGGER_NAME, null, this); this.root.setLevel(Level.DEBUG); loggerCache.put(Logger.ROOT_LOGGER_NAME, root); initEvaluatorMap(); size = 1; this.frameworkPackages = new ArrayList<String>();}

Logger的構造函數(shù)為:

Logger(String name, Logger parent, LoggerContext loggerContext) { this.name = name; this.parent = parent; this.loggerContext = loggerContext;}

看到第一個參數(shù)就是Root的name,而這個Logger.ROOT_LOGGER_NAME的定義為final public String ROOT_LOGGER_NAME = 'ROOT',由此可以看出<root>節(jié)點的name就是'ROOT'。

接著寫一段代碼來測試一下:

public class Slf4jTest { @Test public void testSlf4j() { Logger logger = LoggerFactory.getLogger(Object.class); logger.trace('=====trace====='); logger.debug('=====debug====='); logger.info('=====info====='); logger.warn('=====warn====='); logger.error('=====error====='); }}

logback.xml的配置為:

<?xml version='1.0' encoding='UTF-8' ?><configuration scan='false' scanPeriod='60000' debug='false'> <appender name='STDOUT' class='ch.qos.logback.core.ConsoleAppender'> <layout class='ch.qos.logback.classic.PatternLayout'> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern> </layout> </appender> <root level='info'> <appender-ref ref='STDOUT' /> </root></configuration>

root將打印級別設置為'info'級別,<appender>暫時不管,控制臺的輸出為:

2018-03-26 22:57:48.779 [main] INFO java.lang.Object - =====info=====2018-03-26 22:57:48.782 [main] WARN java.lang.Object - =====warn=====2018-03-26 22:57:48.782 [main] ERROR java.lang.Object - =====error=====

logback.xml的意思是,當Test方法運行時,root節(jié)點將日志級別大于等于info的交給已經(jīng)配置好的名為'STDOUT'的<appender>進行處理,'STDOUT'將信息打印到控制臺上。

接著理解一下<logger>節(jié)點的作用,logback.xml修改一下,加入一個只有name屬性的<logger>:

<?xml version='1.0' encoding='UTF-8' ?><configuration scan='false' scanPeriod='60000' debug='false'> <appender name='STDOUT' class='ch.qos.logback.core.ConsoleAppender'> <layout class='ch.qos.logback.classic.PatternLayout'> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern> </layout> </appender> <logger name='java' /> <root level='debug'> <appender-ref ref='STDOUT' /> </root></configuration>

注意這個name表示的是LoggerFactory.getLogger(XXX.class),XXX的包路徑,包路徑越少越是父級,我們測試代碼里面是Object.class,即name='java'是name='java.lang'的父級,root是所有<logger>的父級。看一下輸出為:

2018-03-27 23:02:02.963 [main] DEBUG java.lang.Object - =====debug=====2018-03-27 23:02:02.965 [main] INFO java.lang.Object - =====info=====2018-03-27 23:02:02.966 [main] WARN java.lang.Object - =====warn=====2018-03-27 23:02:02.966 [main] ERROR java.lang.Object - =====error=====

出現(xiàn)這樣的結果是因為:

<logger>中沒有配置level,即繼承父級的level,<logger>的父級為<root>,那么level=debug 沒有配置additivity,那么additivity=true,表示此<logger>的打印信息向父級<root>傳遞 沒有配置<appender-ref>,表示此<logger>不會打印出任何信息

由此可知,<logger>的打印信息向<root>傳遞,<root>使用'STDOUT'這個<appender>打印出所有大于等于debug級別的日志。舉一反三,我們將<logger>的additivity配置為false,那么控制臺應該不會打印出任何日志,因為<logger>的打印信息不會向父級<root>傳遞且<logger>沒有配置任何<appender>,大家可以自己試驗一下。

接著,我們再配置一個<logger>:

<?xml version='1.0' encoding='UTF-8' ?><configuration scan='false' scanPeriod='60000' debug='false'> <appender name='STDOUT' class='ch.qos.logback.core.ConsoleAppender'> <layout class='ch.qos.logback.classic.PatternLayout'> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern> </layout> </appender> <logger name='java' additivity='false' /> <logger name='java.lang' level='warn'> <appender-ref ref='STDOUT' /> </logger> <root level='debug'> <appender-ref ref='STDOUT' /> </root></configuration>

如果讀懂了上面的例子,那么這個例子應當很好理解:

LoggerFactory.getLogger(Object.class),首先找到name='java.lang'這個<logger>,將日志級別大于等于warn的使用'STDOUT'這個<appender>打印出來 name='java.lang'這個<logger>沒有配置additivity,那么additivity=true,打印信息向上傳遞,傳遞給父級name='java'這個<logger> name='java'這個<logger>的additivity=false且不關聯(lián)任何<appender>,那么name='java'這個<appender>不會打印任何信息

由此分析,得出最終的打印結果為:

2018-03-27 23:12:16.147 [main] WARN java.lang.Object - =====warn=====2018-03-27 23:12:16.150 [main] ERROR java.lang.Object - =====error=====

舉一反三,上面的name='java'這個<appender>可以把additivity設置為true試試看是什么結果,如果對前面的分析理解的朋友應該很容易想到,有兩部分日志輸出,一部分是日志級別大于等于warn的、一部分是日志級別大于等于debug的。

<appender>

接著看一下<appender>,<appender>是<configuration>的子節(jié)點,是負責寫日志的組件。<appender>有兩個必要屬性name和class:

name指定<appender>的名稱 class指定<appender>的全限定名

<appender>有好幾種,上面我們演示過的是ConsoleAppender,ConsoleAppender的作用是將日志輸出到控制臺,配置示例為:

<appender name='STDOUT' class='ch.qos.logback.core.ConsoleAppender'> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern> </encoder> </appender>

其中,encoder表示對參數(shù)進行格式化。我們和上一部分的例子對比一下,發(fā)現(xiàn)這里是有所區(qū)別的,上面使用了<layout>定義<pattern>,這里使用了<encoder>定義<pattern>,簡單說一下:

<encoder>是0.9.19版本之后引進的,以前的版本使用<layout>,logback極力推薦的是使用<encoder>而不是<layout> 最常用的FileAppender和它的子類的期望是使用<encoder>而不再使用<layout>

關于<encoder>中的格式下一部分再說。接著我們看一下FileAppender,F(xiàn)ileAppender的作用是將日志寫到文件中,配置示例為:

<appender name='FILE' class='ch.qos.logback.core.FileAppender'> <file>D:/123.log</file> <append>true</append> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> </encoder></appender>

它的幾個節(jié)點為:

<file>表示寫入的文件名,可以使相對目錄也可以是絕對目錄,如果上級目錄不存在則自動創(chuàng)建 <appender>如果為true表示日志被追加到文件結尾,如果是false表示清空文件 <encoder>表示輸出格式,后面說 <prudent>如果為true表示日志會被安全地寫入文件,即使其他的FileAppender也在向此文件做寫入操作,效率低,默認為false

接著來看一下RollingFileAppender,RollingFileAppender的作用是滾動記錄文件,先將日志記錄到指定文件,當符合某個條件時再將日志記錄到其他文件,RollingFileAppender配置比較靈活,因此使用得更多,示例為:

<appender name='ROLLING-FILE-1' class='ch.qos.logback.core.rolling.RollingFileAppender'> <rollingPolicy class='ch.qos.logback.core.rolling.TimeBasedRollingPolicy'> <fileNamePattern>rolling-file-%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> </encoder></appender>

這種是僅僅指定了<rollingPolicy>的寫法,<rollingPolicy>的作用是當發(fā)生滾動時,定義RollingFileAppender的行為,其中上面的TimeBasedRollingPolicy是最常用的滾動策略,它根據(jù)時間指定滾動策略,既負責滾動也負責觸發(fā)滾動,有以下節(jié)點:

<fileNamePattern>,必要節(jié)點,包含文件名及'%d'轉(zhuǎn)換符,'%d'可以包含一個Java.text.SimpleDateFormat指定的時間格式,如%d{yyyy-MM},如果直接使用%d那么格式為yyyy-MM-dd。RollingFileAppender的file子節(jié)點可有可無,通過設置file可以為活動文件和歸檔文件指定不同的位置 <maxHistory>,可選節(jié)點,控制保留的歸檔文件的最大數(shù)量,如果超出數(shù)量就刪除舊文件,假設設置每個月滾動且<maxHistory>是6,則只保存最近6個月的文件

向其他還有SizeBasedTriggeringPolicy,用于按照文件大小進行滾動,可以自己查閱一下資料。

異步寫日志

日志通常來說都以文件形式記錄到磁盤,例如使用<RollingFileAppender>,這樣的話一次寫日志就會發(fā)生一次磁盤IO,這對于性能是一種損耗,因此更多的,對于每次請求必打的日志(例如請求日志,記錄請求API、參數(shù)、請求時間),我們會采取異步寫日志的方式而不讓此次寫日志發(fā)生磁盤IO,阻塞線程從而造成不必要的性能損耗。(不要小看這個點,可以網(wǎng)上查一下服務端性能優(yōu)化的文章,只是因為將日志改為異步寫,整個QPS就有了大幅的提高)。

接著我們看下如何使用logback進行異步寫日志配置:

<?xml version='1.0' encoding='UTF-8' ?><configuration scan='false' scanPeriod='60000' debug='false'> <appender name='STDOUT' class='ch.qos.logback.core.ConsoleAppender'> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern> </encoder> </appender> <appender name='ROLLING-FILE-1' class='ch.qos.logback.core.rolling.RollingFileAppender'> <rollingPolicy class='ch.qos.logback.core.rolling.TimeBasedRollingPolicy'> <fileNamePattern>D:/rolling-file-%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%-4relative [%thread] %-5level %lo{35} - %msg%n</pattern> </encoder> </appender> <!-- 異步輸出 --> <appender name ='ASYNC' class= 'ch.qos.logback.classic.AsyncAppender'> <!-- 不丟失日志.默認的,如果隊列的80%已滿,則會丟棄TRACT、DEBUG、INFO級別的日志 --> <discardingThreshold>0</discardingThreshold> <!-- 更改默認的隊列的深度,該值會影響性能.默認值為256 --> <queueSize>256</queueSize> <!-- 添加附加的appender,最多只能添加一個 --> <appender-ref ref ='ROLLING-FILE-1'/> </appender> <logger name='java' additivity='false' /> <logger name='java.lang' level='DEBUG'> <appender-ref ref='ASYNC' /> </logger> <root level='INFO'> <appender-ref ref='STDOUT' /> </root></configuration>

即,我們引入了一個AsyncAppender,先說一下AsyncAppender的原理,再說一下幾個參數(shù):

當我們配置了AsyncAppender,系統(tǒng)啟動時會初始化一條名為'AsyncAppender-Worker-ASYNC'的線程當Logging Event進入AsyncAppender后,AsyncAppender會調(diào)用appender方法,appender方法中再將event填入Buffer(使用的Buffer為BlockingQueue,具體實現(xiàn)為ArrayBlockingQueye)前,會先判斷當前Buffer的容量以及丟棄日志特性是否開啟,當消費能力不如生產(chǎn)能力時,AsyncAppender會將超出Buffer容量的Logging Event的級別進行丟棄,作為消費速度一旦跟不上生產(chǎn)速度導致Buffer溢出處理的一種方式。上面的線程的作用,就是從Buffer中取出Event,交給對應的appender進行后面的日志推送從上面的描述我們可以看出,AsyncAppender并不處理日志,只是將日志緩沖到一個BlockingQueue里面去,并在內(nèi)部創(chuàng)建一個工作線程從隊列頭部獲取日志,之后將獲取的日志循環(huán)記錄到附加的其他appender上去,從而達到不阻塞主線程的效果。因此AsyncAppender僅僅充當?shù)氖鞘录D(zhuǎn)發(fā)器,必須引用另外一個appender來做事。

從上述原理,我們就能比較清晰地理解幾個參數(shù)的作用了:

discardingThreshold,假如等于20則表示,表示當還剩20%容量時,將丟棄TRACE、DEBUG、INFO級別的Event,只保留WARN與ERROR級別的Event,為了保留所有的events,可以將這個值設置為0,默認值為queueSize/5 queueSize比較好理解,BlockingQueue的最大容量,默認為256 includeCallerData表示是否提取調(diào)用者數(shù)據(jù),這個值被設置為true的代價是相當昂貴的,為了提升性能,默認當event被加入BlockingQueue時,event關聯(lián)的調(diào)用者數(shù)據(jù)不會被提取,只有線程名這些比較簡單的數(shù)據(jù) appender-ref表示AsyncAppender使用哪個具體的<appender>進行日志輸出

<encoder>

<encoder>節(jié)點負責兩件事情:

把日志信息轉(zhuǎn)換為字節(jié)數(shù)組 把字節(jié)數(shù)組寫到輸出流

目前PatternLayoutEncoder是唯一有用的且默認的encoder,有一個<pattern>節(jié)點,就像上面演示的,用來設置日志的輸入格式,使用“%+轉(zhuǎn)換符'的方式,如果要輸出'%'則必須使用'%'對'%'進行轉(zhuǎn)義。

<encoder>的一些可用參數(shù)用表格表示一下:

轉(zhuǎn)換符 作 用 是否避免使用

c{length}

lo{length}

logger{length}

輸出日志的logger名稱,可有一個整型參數(shù)來縮短<logger>名稱,有幾種情況:

1、不輸入表示輸出完整的<logger>名稱

2、輸入0表示只輸出<logger>最右邊點號之后的字符串

3、輸入其他數(shù)字表示輸出小數(shù)點最后邊點號之前的字符數(shù)量

C{length}

class{length}

輸出指定記錄的請求的調(diào)用者的全限定名,length同上 是

d{pattern}

date{pattern}

輸出時間格式,模式語法同java.text.SimpleDateFormat兼容 否 caller{depth} 輸出生成日志的調(diào)用者的位置信息,整數(shù)選項表示輸出信息深度 否 L 輸出執(zhí)行日志的請求行號 是

m

msg

message

輸出應用程序提供的信息 否 m 輸入執(zhí)行日志請求的方法名 是 n 輸出平臺相關的分行符'n'或者'rn',即換行 否

p

le

level

輸出日志級別 否

r

relative

輸出從程序啟動到創(chuàng)建日志記錄的時間,單位為毫秒 否

t

thread

輸出產(chǎn)生日志的線程名稱 否

Filter

最后來看一下<filter>,<filter>是<appender>的一個子節(jié)點,表示在當前給到的日志級別下再進行一次過濾,最基本的Filter有ch.qos.logback.classic.filter.LevelFilter和ch.qos.logback.classic.filter.ThresholdFilter,首先看一下LevelFilter:

<configuration scan='false' scanPeriod='60000' debug='false'> <appender name='STDOUT' class='ch.qos.logback.core.ConsoleAppender'> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern> </encoder> <filter class='ch.qos.logback.classic.filter.LevelFilter'> <level>WARN</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <logger name='java' additivity='false' /> <logger name='java.lang' level='DEBUG'> <appender-ref ref='STDOUT' /> </logger> <root level='INFO'> <appender-ref ref='STDOUT' /> </root></configuration>

看一下輸出:

2018-03-31 22:22:58.843 [main] WARN java.lang.Object - =====warn=====

看到盡管<logger>配置的是DEBUG,但是輸出的只有warn,因為在<filter>中對匹配到WARN級別時做了ACCEPT(接受),對未匹配到WARN級別時做了DENY(拒絕),當然只能打印出WARN級別的日志。

再看一下ThresholdFilter,配置為:

<?xml version='1.0' encoding='UTF-8' ?><configuration scan='false' scanPeriod='60000' debug='false'> <appender name='STDOUT' class='ch.qos.logback.core.ConsoleAppender'> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern> </encoder> <filter class='ch.qos.logback.classic.filter.ThresholdFilter'> <level>INFO</level> </filter> </appender> <logger name='java' additivity='false' /> <logger name='java.lang' level='DEBUG'> <appender-ref ref='STDOUT' /> </logger> <root level='INFO'> <appender-ref ref='STDOUT' /> </root></configuration>

看一下輸出為:

2018-03-31 22:41:32.353 [main] INFO java.lang.Object - =====info=====2018-03-31 22:41:32.358 [main] WARN java.lang.Object - =====warn=====2018-03-31 22:41:32.359 [main] ERROR java.lang.Object - =====error=====

因為ThresholdFilter的策略是,會將日志級別小于<level>的全部進行過濾,因此雖然指定了DEBUG級別,但是只有INFO及以上級別的才能被打印出來。

到此這篇關于Java日志框架之logback使用詳解的文章就介紹到這了,更多相關Java日志框架logback內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持好吧啦網(wǎng)!

標簽: Java
相關文章:
主站蜘蛛池模板: 狠狠艹夜夜艹 | 欧美激情第1页 | 男人的天堂久久 | 999精品视频| 免费看的毛片 | 免费观看一区二区三区毛片 | 国产在线精品一区二区三区 | 欧美国产在线一区 | 国产精选视频 | 国产h在线| 亚洲综合在线一区 | 中文字幕国产一区 | 久久久影视 | av高清在线看| 午夜国产一区 | 精品国产一区二区三区免费 | 欧日韩毛片 | 国产精品一区二区在线 | 国产一级特黄aaa | 亚洲第一成人在线视频 | 成人亚洲视频 | 国产77777 | 在线高清av | 中文字幕日韩在线视频 | 日韩精品2区 | 中文字幕不卡在线88 | 久久草视频 | 蜜桃一区| 色999视频 | 成人黄色电影在线观看 | 欧美一区二区三区免费 | 久久男人的天堂 | 久久精品亚洲 | 久久久久久亚洲精品 | 欧美综合激情 | 在线观看免费的网站www | 中国一级毛片 | 国产3区| 97理论片| www,99热| 日韩精品视频网 | 亚洲天堂中文字幕 | 可以免费看黄的网站 | 污污视频免费网站 | 久久久精 | 四虎小视频 | 中文字幕在线精品 | 日韩国产欧美亚洲 | 天天干天天操 | 99爱爱视频 | 日韩亚洲在线 | 午夜小视频在线观看 | 干片网| 黄色片毛片| 午夜在线观看视频 | 国产成人精品亚洲日本在线观看 | 国产一级免费视频 | 在线看国产| 亚洲第一成年免费网站 | 激情五月婷婷综合 | 精品1区 | 国产精品久久久久无码av | 欧美日韩三区 | 天堂中文资源在线 | 在线播放黄色片网站 | 国产一区二区三区久久久久久 | 在线观看av国产一区二区 | 精品久久久久久久人人人人传媒 | 在线免费国产 | 好姑娘影视在线观看高清 | 中文字幕在线看第二 | 欧美日韩亚洲视频 | 黄色片免费观看网站 | 九九久久精品 | 欧美午夜一区二区三区免费大片 | 巨大黑人极品videos精品 | 欧美国产视频 | 精品一区二区三区免费视频 | 国产亚洲一区二区三区在线观看 | 国产 日韩 一区 | 国产成人av在线播放 | 人人插人人干 | 日韩欧美在线一区二区 | 久久福利电影 | jizz欧美大片| 欧美日韩一区二区三区视频 | 免费日韩 | 国产精品久久av | 精品一区av| 欧美日韩精品在线 | 久久久蜜桃一区二区人 | 久久伊人久久 | 一区二区三区精品视频免费看 | h片观看| 久久国产精品无码网站 | 国产成人高清 | 国产一区久久 | 99热热热| 欧美一区二区三区视频 | 久久亚洲一区二区三 | 一区二区三区在线免费观看 | 久久九九国产精品 | 亚洲欧美一区二区三区在线 | 国产色在线 | a∨在线观看 | 在线观看中文视频 | 免费欧美一级 | 欧美日韩综合视频 | 91精品久久久久久久久中文字幕 | 亚洲精品v | 久久久久久久久一区二区 | 久久国产一区二区三区 | 久久精品免费一区二区三区 | 99在线免费视频 | 国产免费久久 | 国产精品污www在线观看 | 欧美人体一区二区三区 | 日批的视频 | 日日做夜夜爱 | 欧美精品欧美精品系列 | 91麻豆精品国产91久久久资源速度 | 黄色国产大片 | 国产一区二区三区免费视频 | 啪一啪操一操 | 日本成人在线视频网站 | 高清一区二区三区 | 欧美日韩一区二区中文字幕 | 亚洲视频三区 | 久久伊人免费视频 | 欧美理论视频 | t66y最新地址一地址二69 | 欧美午夜一区二区三区免费大片 | 日韩成人免费电影 | 精品一二三区 | 91精品国产91久久久久久吃药 | 日韩不卡一区二区 | 久久精品久久精品 | 国产一区二区三区免费在线观看 | 91精品久久久久久久久久久久久久久 | 久草精品视频在线播放 | 毛片a片| 久久久久久久久99精品 | 国产欧美日韩在线观看 | 久久久性色精品国产免费观看 | www.久久视频 | 91福利视频导航 | 中文字幕 欧美 日韩 | 国产精品一区亚洲二区日本三区 | 欧美日韩精品在线 | 嫩草最新网址 | 成人免费一区二区三区视频网站 | 日韩欧美一区在线 | 操人在线观看 | 视频一区二区三区免费观看 | 女人爽到高潮aaaa电影 | 99国内精品久久久久久久 | 韩日精品| 国产成人午夜精品影院游乐网 | 性色av一二三杏吧传媒 | 精品久久国产 | 国产精品免费av | 国产亚洲精品精品国产亚洲综合 | 久久亚洲精品中文字幕 | 国产精品99久久免费观看 | 国产污视频在线 | 色婷网 | 久久综合一区二区三区 | 亚洲动漫在线观看 | 午夜视频网 | 一级黄色片在线 | 96自拍视频| 欧美日韩免费一区二区三区 | 国产欧美一区二区精品性色 | 欧美一区二区三区在线观看视频 | 特级毛片在线 | av三级在线观看 | 欧美久久久久久久久久伊人 | 久久99精品久久久久久园产越南 | 亚洲成人精品一区 | 免费看a| 日本日韩中文字幕 | 日韩成人高清 | 亚洲精品久久久久久下一站 | 午夜精品一区二区三区四区 | 黑人巨大精品欧美一区免费视频 | 在线观看亚洲大片短视频 | 久久人人爽人人爽人人片亚洲 | 91.成人天堂一区 | 男人阁久久 | 综合一区二区三区 | 亚洲a级 | 狠狠综合久久av一区二区老牛 | 狠狠色综合久久丁香婷婷 | 黄色国产一级视频 | 久久亚洲国产精品 | 91九色最新 | 国产成人精品一区二区三区视频 | 日韩欧美一区二区三区视频 | 中文字幕 国产精品 | 国产激情在线观看 | 欧美一区2区三区4区公司二百 | 国产ts人妖另类 | 久久精品国产精品 | 国产性网| 免费一看一级毛片 | 精品久久久久久国产 | 91精品国产日韩91久久久久久 | 欧美一级特黄aaaaaaa视频片 | 91黄色在线观看 | 日韩欧美高清视频 | 中文字幕avav | 少妇黄色一级片 | 成人精品视频 | 欧美日韩在线一区二区三区 | 夜添久久精品亚洲国产精品 | 亚洲成人一区 | 91不卡| 国产精品久久精品 | www亚洲成人 | 日韩专区视频 | 中文字幕第一页在线视频 | 日韩一区电影 | 精品香蕉一区二区三区 | 91精品视频在线播放 | 久久亚洲一区二区三区四区 | h免费在线观看 | 色综合网站 | 国产一区欧美 | 国产乱码精品一区二区三区忘忧草 | 欧美激情首页 | 69久久99精品久久久久婷婷 | 国产99一区二区 | 久久久国产精品 | 欧美黑人做爰xxxⅹ 国产精品一区二区视频 | 亚洲精品乱码久久久久久蜜桃不爽 | 黄色片在线 | 亚洲精品欧美精品 | 久久久久国产精品午夜一区 | 日韩成人中文字幕 | 美女一区二区三区在线观看 | 日本爱爱 | 自拍视频免费 | 国产一级黄色大片 | 日韩另类 | 久久久久久久99精品免费观看 | 国产噜噜噜噜噜久久久久久久久 | 日韩欧美在线观看一区二区三区 | 国产日韩一区 | 在线观看国产精品一区 | 97视频人人澡人人爽 | 亚洲精品网址 | 亚洲国产视频一区 | 亚洲久悠悠色悠在线播放 | 黑人巨大精品欧美黑白配亚洲 | 国产精品成人在线 | 国产成人精品久久二区二区91 | 男女啪啪无遮挡 | 欧美日韩精品一区二区在线播放 | 国产欧美在线观看 | 精品久久一区 | 亚洲精品国产setv | 中文字幕亚洲欧美日韩在线不卡 | 久久久精品久久 | 国产三级视频 | 久久91 | 黄色骚片 | 国产女人高潮视频在线观看 | 国产不卡视频在线观看 | 一区视频网站 | 91视频精选 | 国产一级大片 | 精品人人 | 日韩欧美一区二区在线观看视频 | 夜夜天天操 | 免费观看在线午夜影视 | 国产片久久 | 亚洲精品久久久久久久久久久 | 欧美精品一区二区三区视频 | 精品久久久久久亚洲精品 | 久久久久久国产精品 | 91文字幕巨乱亚洲香蕉 | 欧美在线影院 | 欧美日韩不卡合集视频 | 精品视频一区二区三区 | 亚洲欧美高清 | 一区二区三区在线视频播放 | 日韩中文字幕免费观看 | 美女福利视频网站 | 欧美一级黄色影院 | 国产精品综合一区二区 | 欧美在线视频一区二区 | 亚洲欧洲av在线 | 国产一级高清视频 | 日韩欧美二区 | 欧美日韩一区二区在线 | 国产玖玖 | 男人的天堂亚洲 | 久久国产精品首页 | 激情欧美一区二区 | 91秦先生艺校小琴 | 91精品国产一区二区三区蜜臀 | 久久2 | 一区二区三区国产在线 | 久草网在线视频 | 狠狠干影院| 最新中文字幕在线 | 成人在线视频免费观看 | 欧美黄色性视频 | 欧美日韩电影一区二区 | 亚洲精品视频免费看 | 美女诱惑av | 日本理论片好看理论片 | 国产成人精品午夜视频' | 自拍偷拍99 | av国产精品毛片一区二区小说 | 国产精品1 | 久久99精品久久久久国产越南 | 精品国产乱码一区二区三区 | 三级成人在线 | 综合 欧美 亚洲日本 | 中文字幕一区二区三区四区 | 黄色片在线免费看 | 久久99精品久久久久蜜臀 | 国产免费一区二区三区四区五区 | 欧美视频在线观看不卡 | 午夜在线电影 | 亚洲精品视频导航 | 国产一级免费视频 | 亚洲永久免费 | 亚洲高清在线视频 | 一区二区三区国产 | japanhd熟睡侵犯 | 中文字幕日韩欧美一区二区三区 | 亚洲精品一区二区三区在线播放 | 国产精品视频一区二区三区四 | 色婷婷在线播放 | 中文字幕第一页在线视频 | 99国产精品久久久久久久 | 欧美wwwsss9999| 精品久久香蕉国产线看观看亚洲 | 成人性大片免费观看网站 | 免费在线精品视频 | 亚洲成人免费视频在线观看 | 亚洲午夜精品在线观看 | 欧美综合一区 | 久久久综合色 | 日韩成人精品在线 | 久久人| 91一区| 国产综合亚洲精品一区二 | 久久久久久久久久久九 | 精国产品一区二区三区 | 91久久夜色精品国产网站 | 亚洲日韩欧美一区二区在线 | 亚洲成人精品视频 | 黄毛片视频 | 超碰免费在线观看 | 日韩成人片 | 美日韩在线 | 国产精品久久国产愉拍 | 91久久久久久 | 日本欧美在线 | 国产精品久久久久久影院8一贰佰 | 久草成人| av成人免费在线观看 | 欧美日韩中文在线 | 成人欧美一区二区三区黑人孕妇 | 国产精品99久久久久久久vr | 国产高清精 | 亚洲人成人一区二区在线观看 | 亚洲高清视频在线观看 | 在线日韩视频 | 精品国产乱码久久久久久1区2区 | 一本大道久久a久久精二百 国产精品片aa在线观看 | 亚洲国产精久久久久久久 | 中文字幕亚洲第一 | 色www精品视频在线观看 | 国产精品视频一区二区三区四 | 综合网激情 | 欧美在线一区二区 | 伊人免费在线观看高清版 | 色综合色综合 | 在线观看成人小视频 | 日韩中文视频 | 亚洲午夜精品 | 一级毛片在线看aaaa | 毛片真人毛毛片毛片 | 一区二区三区免费 | 精品免费一区二区 | 日韩一日 | 91麻豆精品国产91久久久资源速度 | 成人三级视频网站 | 国产午夜精品美女视频明星a级 | 国产精品久久久久久久久 | 久久久久亚洲一区二区三区 | 欧美一级片免费看 | 亚洲午夜精品片久久www慈禧 | 青青草国产成人av片免费 | 久久久久中文字幕 | 欧美日韩激情在线一区二区三区 | 91在线看 | 国产福利一区二区三区四区 | 成人不卡 | 91麻豆精品国产91久久久久 | 亚洲精品视频在线 | 另类久久| 91观看 | 国产97色在线 | 亚洲 | 日本一区二区三区四区 | 日本一二三区在线 | 国产精品日韩欧美 | 国产在线激情视频 | 天天澡天天狠天天天做 | 午夜影院免费 | 亚洲激情在线 | 一区二区色 | 在线精品国产 | 日本好好热视频 | 久草久草久草 | 日韩欧美一区二区视频 | 国产91视频一区二区 | 成人欧美 | 奇米影视奇米色777欧美 | 亚洲精品7777xxxx青睐 | 天天色天天 | 黄色小视频在线观看 | 久久全国免费视频 | 9999亚洲| 在线国产视频 | 国产成人99久久亚洲综合精品 | 欧美在线一区二区三区 | 欧美成人免费视频 | 骚黄视频| 日日摸日日碰夜夜爽亚洲精品蜜乳 | 在线观看成人 | 看全黄大色黄大片老人做 | jjzz18国产| 精品视频一区二区三区 | 国产激情一区二区三区成人免费 | 思热99re视热频这里只精品 | 日韩电影a | 亚洲狠狠爱一区二区三区 | 亚洲精品a在线观看 | 中文字幕在线精品 | 国产视频一区二区三区四区 | 九九综合| 69性欧美高清影院 | 国产精品久久久久久久毛片 | 国产目拍亚洲精品99久久精品 | 精品国产一区二区三区久久影院 | 欧美成人高清视频 | 国产免费黄视频 | 精品久久ai | av影音资源 | 国产日韩亚洲欧美 | 福利91| 国产一区二区三区久久久久久久久 | 午夜小电影| 91精品久久久久久久久久 | 亚洲h在线观看 | 小草av | 成人作爱视频 | 2018国产精品 | 国产精品久久九九 | 欧美日韩精品 | 婷婷在线视频 | 亚洲一区二区三区四区五区中文 | 国内精品久久久久久影视8 91一区二区在线观看 | 成人不卡| 国产精品不卡 | √天堂在线 | 四色永久 | 91一区在线 | 99热影院| 日韩精品一区二区三区中文字幕 | 一区福利视频 | 伊人av超碰久久久麻豆 | 大黄网站在线观看 | 久草成人网| 久久小视频 | 国产精品综合久久 | 久久久久国产 | 在线日韩中文字幕 | a级在线观看 | 99综合在线 | 日韩在线播放一区 | 欧洲美女性开放视频 | 免费成人高清在线视频 | 国产一区二区三区在线免费观看 | 国产高清视频在线观看 | 色噜噜色综合 | 中国大陆高清aⅴ毛片 | 日韩精品一区二区三区在线播放 | 国产精品片aa在线观看 | 九色在线观看 | 国产精品中文字幕在线播放 | 亚洲综合日韩 | 区一区二区三在线观看 | 天天干天天操天天爽 | 国产精品成人一区二区三区夜夜夜 | 亚洲一区二区三区中文字幕 | 欧美一区永久视频免费观看 | 一区二区三区自拍 | 91中文 | 国产亚洲欧美在线 | 国产剧情一区二区 | 欧美日韩精品一区二区三区在线观看 | jizzjizz亚洲中国少妇 | 久久久久久毛片免费播放 | 日日操夜夜操免费视频 | 日本在线观看视频一区 | 99精品免费观看 | 欧日韩不卡在线视频 | 免费观看一区二区三区 | www.国产欧美 | 久草视频首页 | av网站网址 | 亚洲人成网亚洲欧洲无码 | 日韩www视频| 欧美日韩在线免费观看 | 国偷自产一区二区免费视频 | 日本一级中文字幕久久久久久 | 国产一区二区免费 | 午夜av影院| 日本在线视频观看 | 台湾佬成人 | 精品中文在线 | 99re在线视频精品 | 久久青青视频 | 亚洲欧美一区二区三区不卡 | 国产色 | 夜夜草av| 欧美另类综合 | 日韩精品一区二区三区中文在线 | 做视频免费观看网站 | 国产一区二区三区网站 | japan国产精选videos | 黄网站在线播放 | 久久久久久久久国产精品 | 欧美天天 | 激情欧美一区二区三区中文字幕 | 国产精品久久久久久久久免费软件 | 九色在线观看 | 成人在线视频网站 | 亚洲欧美一区二区三区不卡 | 国产精品成人国产乱一区 | 日韩在线免费 | 人人射av | av中文字幕网| 久久精品一区二区三区四区 | 91在线精品秘密一区二区 | 99久久视频 | 在线观看亚洲视频 | 亚洲综合二 | 色999视频 | 九九热免费看 | 午夜成年人 | 亚洲免费视频在线 | 人人草天天草 | 精产国产伦理一二三区 | 日本中文一区二区 | 国产一区二区在线看 | 欧美性18 | 日韩精品一区二区三区视频播放 | 九九视频网 | 91在线看 | 亚洲狠狠爱一区二区三区 | 精品久久久久久久久久久久久久久 | 色婷婷一区二区三区四区 | 亚洲一区精品在线 | 成人午夜剧场 | 99精品欧美一区二区三区综合在线 | 91亚洲国产成人精品性色 | 日韩精品免费在线观看 | 男人视频网站 | 色综合久| 久久久999精品视频 五月天婷婷在线视频 | 午夜伦理影院 | 精品视频久久久 | 日日干日日操 | 午夜影院色 | 1000部精品久久久久久久久 | 中文成人无字幕乱码精品 | 天天操网 | 成人一区二区三区在线 | 综合网日韩| 欧美日韩国产一区二区三区 | 91精品中文字幕一区二区三区 | 在线免费国产视频 | 国产亚洲综合一区二区 | 国产成人精品一区二区在线 | 欧美亚洲一区 | 欧美日韩在线观看一区二区 | 日韩在线免费观看网站 | 中文字幕在线观看亚洲 | 亚洲午夜视频在线观看 | 影音先锋亚洲精品 | 99国产精品99久久久久久 | 91色视频在线观看 | 欧美激情首页 | 亚洲一级黄色 | 国产精品7 | 国产成人精 | 久久噜噜噜精品国产亚洲综合 | 91在线精品秘密一区二区 | 欧美精品一区二区三区在线四季 | 91久久国产 | 天堂一区 | 欧美大片在线看免费观看 | 欧美日韩精品一区二区三区在线观看 | 精品久久久久一区二区国产 | 久久久天堂国产精品女人 | 91丁香婷婷综合久久欧美 | 国产一区二区三区在线免费 | 蜜臀精品久久久久久蜜臀 |