亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

log4j使用教程詳解(怎么使用log4j2)

2019-11-26 15:50:13
字體:
來源:轉載
供稿:網友

1. 去官方下載log4j 2,導入jar包,基本上你只需要導入下面兩個jar包就可以了(xx是亂七八糟的版本號):

log4j-core-xx.jar

log4j-api-xx.jar

2. 導入到你的項目中:這個就不說了。

3. 開始使用:

我們知道,要在某個類中使用log4j記錄日志,只需要申明下面的成員變量(其實不一定要是成員變量,只是為了方便調用而已)

復制代碼 代碼如下:

private static Logger logger = LogManager.getLogger(MyApp.class.getName());

里getLogger有一個參數指定的是這個logger的名稱,這個名稱在配置文件里面可是有需要的,這個待會兒再說。

聲明了Logger對象,我們就可以在代碼中使用他了。

4. 日志的級別:

我們現在要調用logger的方法,不過在這個Logger對象中,有很多方法,所以要先了解log4j的日志級別,log4j規定了默認的幾個級別:trace<debug<info<warn<error<fatal等。這里要說明一下:

1)級別之間是包含的關系,意思是如果你設置日志級別是trace,則大于等于這個級別的日志都會輸出。

2)基本上默認的級別沒多大區別,就是一個默認的設定。你可以通過它的API自己定義級別。你也可以隨意調用這些方法,不過你要在配置文件里面好好處理了,否則就起不到日志的作用了,而且也不易讀,相當于一個規范,你要完全定義一套也可以,不用沒多大必要。

3)這不同的級別的含義大家都很容易理解,這里就簡單介紹一下:

trace: 是追蹤,就是程序推進以下,你就可以寫個trace輸出,所以trace應該會特別多,不過沒關系,我們可以設置最低日志級別不讓他輸出。

debug: 調試么,我一般就只用這個作為最低級別,trace壓根不用。是在沒辦法就用eclipse或者idea的debug功能就好了么。

info: 輸出一下你感興趣的或者重要的信息,這個用的最多了。

warn: 有些信息不是錯誤信息,但是也要給程序員的一些提示,類似于eclipse中代碼的驗證不是有error 和warn(不算錯誤但是也請注意,比如以下depressed的方法)。

error: 錯誤信息。用的也比較多。

fatal: 級別比較高了。重大錯誤,這種級別你可以直接停止程序了,是不應該出現的錯誤么!不用那么緊張,其實就是一個程度的問題。

5. 日志調用:

這里隨便寫個類,調用就是這么簡單,log4j的核心在配置文件上。

復制代碼 代碼如下:

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Hello {

    static Logger logger = LogManager.getLogger(Hello.class.getName());

    public boolean hello() {
        logger.entry();   //trace級別的信息,單獨列出來是希望你在某個方法或者程序邏輯開始的時候調用,和logger.trace("entry")基本一個意思
        logger.error("Did it again!");   //error級別的信息,參數就是你輸出的信息
        logger.info("我是info信息");    //info級別的信息
        logger.debug("我是debug信息");
        logger.warn("我是warn信息");
        logger.fatal("我是fatal信息");
        logger.log(Level.DEBUG, "我是debug信息");   //這個就是制定Level類型的調用:誰閑著沒事調用這個,也不一定哦!
        logger.exit();    //和entry()對應的結束方法,和logger.trace("exit");一個意思
        return false;
    }
}

如果沒有自定義配置文件,上面這個類在寫一個main方法,控制臺會輸入下面的樣子:

復制代碼 代碼如下:

19:09:40.256 [main] ERROR cn.lsw.base.log4j2.Hello - Did it again!
19:09:40.260 [main] FATAL cn.lsw.base.log4j2.Hello - 我是fatal信息

看到沒,只有>=ERROR的日志輸出來了(這是因為Log4j有一個默認的配置,它的日志級別是ERROR,輸出只有控制臺)。如果我已經定義好了日志,我把日志級別改成了TRACE,輸出會變成下面這樣:

復制代碼 代碼如下:

19:11:36.941 TRACE cn.lsw.base.log4j2.Hello 12 hello - entry
19:11:36.951 ERROR cn.lsw.base.log4j2.Hello 13 hello - Did it again!
19:11:36.951 INFO  cn.lsw.base.log4j2.Hello 14 hello - 我是info信息
19:11:36.951 DEBUG cn.lsw.base.log4j2.Hello 15 hello - 我是debug信息
19:11:36.951 WARN  cn.lsw.base.log4j2.Hello 16 hello - 我是warn信息
19:11:36.952 FATAL cn.lsw.base.log4j2.Hello 17 hello - 我是fatal信息
19:11:36.952 DEBUG cn.lsw.base.log4j2.Hello 18 hello - 我是debug信息
19:11:36.952 TRACE cn.lsw.base.log4j2.Hello 19 hello - exit

所有的日志都打印出來了,大家可以對照上面的代碼看一看。

6. 配置文件:

現在開始正題了。

本來以為Log4J 2應該有一個默認的配置文件的,不過好像沒有找到,下面這個配置文件等同于缺省配置:

復制代碼 代碼如下:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration status="OFF"> 
  <appenders> 
    <Console name="Console" target="SYSTEM_OUT"> 
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
    </Console> 
  </appenders> 
  <loggers> 
    <root level="error"> 
      <appender-ref ref="Console"/> 
    </root> 
  </loggers> 
</configuration>

而我們只要把configuration>loggers>root的level屬性改為trace,就可以輸出剛才寫的所有信息了。相信用過Log4j的人對這個配置文件也不算陌生,Log4J傳統的配置一直是.properties文件,鍵值對的形式,那種配置方式很不好看,但是基本上我們從這個配置文件也能看到Log4J 1的影子,無非是appender了,layout之類的,含義也基本一樣的。

這里不準備仔細的講配置文件,沒什么必要,大家只要知道一些基本的配置就可以了。我這里寫幾個配置文件,并且給了一定的注釋和講解,基本上可以用了。

 第一個例子:

復制代碼 代碼如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
    <appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </appenders>
    <loggers>
        <!--我們只讓這個logger輸出trace信息,其他的都是error級別-->
        <!--
        additivity開啟的話,由于這個logger也是滿足root的,所以會被打印兩遍。
        不過root logger 的level是error,為什么Bar 里面的trace信息也被打印兩遍呢
        -->
        <logger name="cn.lsw.base.log4j2.Hello" level="trace" additivity="false">
            <appender-ref ref="Console"/>
        </logger>
        <root level="error">
            <appender-ref ref="Console"/>
        </root>
    </loggers>
</configuration>

先簡單介紹一下下面這個配置文件。

1)根節點configuration,然后有兩個子節點:appenders和loggers(都是復數,意思就是可以定義很多個appender和logger了)(如果想詳細的看一下這個xml的結構,可以去jar包下面去找xsd文件和dtd文件)

2)appenders:這個下面定義的是各個appender,就是輸出了,有好多類別,這里也不多說(容易造成理解和解釋上的壓力,一開始也未必能聽懂,等于白講),先看這個例子,只有一個Console,這些節點可不是隨便命名的,Console就是輸出控制臺的意思。然后就針對這個輸出設置一些屬性,這里設置了PatternLayout就是輸出格式了,基本上是前面時間,線程,級別,logger名稱,log信息等,差不多,可以自己去查他們的語法規則。

3)loggers下面會定義許多個logger,這些logger通過name進行區分,來對不同的logger配置不同的輸出,方法是通過引用上面定義的logger,注意,appender-ref引用的值是上面每個appender的name,而不是節點名稱。

這個例子為了說明什么呢?我們要說說這個logger的name(名稱)了(前面有提到)。

7. name的機制:

 我們這里看到了配置文件里面是name很重要,沒錯,這個name可不能隨便起(其實可以隨便起)。這個機制意思很簡單。就是類似于java package一樣,比如我們的一個包:cn.lsw.base.log4j2。而且,可以發現我們前面生成Logger對象的時候,命名都是通過 Hello.class.getName(); 這樣的方法,為什么要這樣呢? 很簡單,因為有所謂的Logger 繼承的問題。比如 如果你給cn.lsw.base定義了一個logger,那么他也適用于cn.lsw.base.lgo4j2這個logger。名稱的繼承是通過點(.)分隔的。然后你可以猜測上面loggers里面有一個子節點不是logger而是root,而且這個root沒有name屬性。這個root相當于根節點。你所有的logger都適用與這個logger,所以,即使你在很多類里面通過  類名.class.getName()  得到很多的logger,而且沒有在配置文件的loggers下面做配置,他們也都能夠輸出,因為他們都繼承了root的log配置。

我們上面的這個配置文件里面還定義了一個logger,他的名稱是 cn.lsw.base.log4j2.Hello ,這個名稱其實就是通過前面的Hello.class.getName(); 得到的,我們為了給他單獨做配置,這里就生成對于這個類的logger,上面的配置基本的意思是只有cn.lsw.base.log4j2.Hello 這個logger輸出trace信息,也就是他的日志級別是trace,其他的logger則繼承root的日志配置,日志級別是error,只能打印出ERROR及以上級別的日志。如果這里logger 的name屬性改成cn.lsw.base,則這個包下面的所有logger都會繼承這個log配置(這里的包是log4j的logger name的“包”的含義,不是java的包,你非要給Hello生成一個名稱為“myhello”的logger,他也就沒法繼承cn.lsw.base這個配置了。

 

那有人就要問了,他不是也應該繼承了root的配置了么,那么會不會輸出兩遍呢?我們在配置文件中給了解釋,如果你設置了additivity="false",就不會輸出兩遍,否則,看下面的輸出:

這里要在加入一個類做對比: 

復制代碼 代碼如下:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Test {


    private static Logger logger = LogManager.getLogger(Test.class.getName());

    public static void main(String[] args) {

        logger.trace("開始程序.");
        Hello hello= new Hello();
//        for (int i = 0; i < 10000;i++){
            if (!hello.hello()) {
                logger.error("hello");
            }
//        }
        logger.trace("退出程序.");
    }
}

這里先把配置文件改一下方便對照,一個是剛才第一個logger的名稱還是cn.lsw.base.log4j2.Hello,additivity去掉或改為true(因為默認是true,所以可以去掉),第二是把root的level改為info方便觀察?!?/P>

然后運行Test,看控制臺的日志輸出:

復制代碼 代碼如下:

2013-12-20 19:59:42.538 [main] INFO  cn.lsw.base.log4j2.Test - test
2013-12-20 19:59:42.541 [main] TRACE cn.lsw.base.log4j2.Hello - entry
2013-12-20 19:59:42.541 [main] TRACE cn.lsw.base.log4j2.Hello - entry
2013-12-20 19:59:42.542 [main] ERROR cn.lsw.base.log4j2.Hello - Did it again!
2013-12-20 19:59:42.542 [main] ERROR cn.lsw.base.log4j2.Hello - Did it again!
2013-12-20 19:59:42.542 [main] INFO  cn.lsw.base.log4j2.Hello - 我是info信息
2013-12-20 19:59:42.542 [main] INFO  cn.lsw.base.log4j2.Hello - 我是info信息
2013-12-20 19:59:42.542 [main] DEBUG cn.lsw.base.log4j2.Hello - 我是debug信息
2013-12-20 19:59:42.542 [main] DEBUG cn.lsw.base.log4j2.Hello - 我是debug信息
2013-12-20 19:59:42.542 [main] WARN  cn.lsw.base.log4j2.Hello - 我是warn信息
2013-12-20 19:59:42.542 [main] WARN  cn.lsw.base.log4j2.Hello - 我是warn信息
2013-12-20 19:59:42.542 [main] FATAL cn.lsw.base.log4j2.Hello - 我是fatal信息
2013-12-20 19:59:42.542 [main] FATAL cn.lsw.base.log4j2.Hello - 我是fatal信息
2013-12-20 19:59:42.542 [main] DEBUG cn.lsw.base.log4j2.Hello - 我是debug信息
2013-12-20 19:59:42.542 [main] DEBUG cn.lsw.base.log4j2.Hello - 我是debug信息
2013-12-20 19:59:42.543 [main] TRACE cn.lsw.base.log4j2.Hello - exit
2013-12-20 19:59:42.543 [main] TRACE cn.lsw.base.log4j2.Hello - exit
2013-12-20 19:59:42.543 [main] ERROR cn.lsw.base.log4j2.Test - hello

可以看出,Test的trace日志沒有輸出,因為他繼承了root的日志配置,只輸出info即以上級別的日志。Hello 輸出了trace及以上級別的日志,但是每個都輸出了兩遍。你可以試一下,把第一個logger的level該為error,那么error以上的級別也是輸出兩遍。這時候,只要加上additivity為false就可以避免這個問題了。

當然,你可以為每個logger 都在配置文件下面做不同的配置,也可以通過繼承機制,對不同包下面的日志做不同的配置。因為loggers下面可以寫很多歌logger。

下面在看一個稍微復雜的例子:

復制代碼 代碼如下:

<?xml version="1.0" encoding="UTF-8"?>

<configuration status="error">
    <!--先定義所有的appender-->
    <appenders>
        <!--這個輸出控制臺的配置-->
        <Console name="Console" target="SYSTEM_OUT">
            <!--控制臺只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
            <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
            <!--這個都知道是輸出日志的格式-->
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </Console>
        <!--文件會打印出所有信息,這個log每次運行程序會自動清空,由append屬性決定,這個也挺有用的,適合臨時測試用-->
        <File name="log" fileName="log/test.log" append="false">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </File>

        <!--這個會打印出所有的信息,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面并進行壓縮,作為存檔-->
        <RollingFile name="RollingFile" fileName="logs/app.log"
                     filePattern="log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
            <SizeBasedTriggeringPolicy size="50MB"/>
        </RollingFile>
    </appenders>
    <!--然后定義logger,只有定義了logger并引入的appender,appender才會生效-->
    <loggers>
        <!--建立一個默認的root的logger-->
        <root level="trace">
            <appender-ref ref="RollingFile"/>
            <appender-ref ref="Console"/>
        </root>

    </loggers>
</configuration>

說復雜,其實也不復雜,這一個例子主要是為了講一下appenders。

這里定義了三個appender,Console,File,RollingFile,看意思基本也明白,第二個是寫入文件,第三個是“循環”的日志文件,意思是日志文件大于閥值的時候,就開始寫一個新的日志文件。

這里我們的配置文件里面的注釋算比較詳細的了。所以就大家自己看了。有一個比較有意思的是ThresholdFilter ,一個過濾器,其實每個appender可以定義很多個filter,這個功能很有用。如果你要選擇控制臺只能輸出ERROR以上的類別,你就用ThresholdFilter,把level設置成ERROR,onMatch="ACCEPT" onMismatch="DENY" 的意思是匹配就接受,否則直接拒絕,當然有其他選擇了,比如交給其他的過濾器去處理了之類的,詳情大家自己去琢磨吧。

為什么要加一個這樣的配置文件呢?其實這個配置文件我感覺挺好的,他的實用性就在下面:

8. 一個實用的配置文件:

我們用日志一方面是為了記錄程序運行的信息,在出錯的時候排查之類的,有時候調試的時候也喜歡用日志。所以,日志如果記錄的很亂的話,看起來也不方便。所以我可能有下面一些需求:

1)我正在調試某個類,所以,我不想讓其他的類或者包的日志輸出,否則會很多內容,所以,你可以修改上面root的級別為最高(或者謹慎起見就用ERROR),然后,加一個針對該類的logger配置,比如第一個配置文件中的設置,把他的level設置trace或者debug之類的,然后我們給一個appender-ref是定義的File那個appender(共三個appender,還記得嗎),這個appender的好處是有一個append為false的屬性,這樣,每次運行都會清空上次的日志,這樣就不會因為一直在調試而增加這個文件的內容,查起來也方便,這個和輸出到控制臺就一個效果了。

2)我已經基本上部署好程序了,然后我要長時間運行了。我需要記錄下面幾種日志,第一,控制臺輸出所有的error級別以上的信息。第二,我要有一個文件輸出是所有的debug或者info以上的信息,類似做程序記錄什么的。第三,我要單獨為ERROR以上的信息輸出到單獨的文件,如果出了錯,只查這個配置文件就好了,不會去處理太多的日志,看起來頭都大了。怎么做呢,很簡單。

>首先,在appenders下面加一個Console類型的appender,通過加一個ThresholdFilter設置level為error。(直接在配置文件的Console這個appender中修改)

>其次,增加一個File類型的appender(也可以是RollingFile或者其他文件輸出類型),然后通過設置ThresholdFilter的level為error,設置成File好在,你的error日志應該不會那么多,不需要有多個error級別日志文件的存在,否則你的程序基本上可以重寫了。

這里可以添加一個appender,內容如下:

復制代碼 代碼如下:

<File name="ERROR" fileName="logs/error.log">
            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </File>

并在loggers中的某個logger(如root)中引用(root節點加入這一行作為子節點)?!?/P>

復制代碼 代碼如下:

<appender-ref ref="ERROR" />

>然后,增加一個RollingFile的appender,設置基本上同上面的那個配置文件。

>最后,在logger中進行相應的配置。不過如果你的logger中也有日志級別的配置,如果級別都在error以上,你的appender里面也就不會輸出error一下的信息了。

還記得上面的Test類里面有一個被注釋掉的for循環么?這個是為了做配置文件中RollingFile那個appender的配置的,取消注釋,運行商一次或幾次,看你的輸出配置文件的地方,他是怎么“RollingFile”的,這里給個我測試的截圖:(這里你可以把 <SizeBasedTriggeringPolicy size="50MB"/>這里的size改成2MB,要生成50MB的日志還是比較慢的。為了方便觀察么!然后把Console的ThresholdFilter的level設置成error這樣的較高級別,不然控制臺輸出東西太多了)

第一部分(圖中標識為1),是我加入的jar包;

第二部分是File這個appender生成的日志文件,你會發現你運行很多次,這個文件中的日志是被覆蓋的。

第三部分是RollingFile 這個appender生成的配置文件,可以發現,默認建立的是app.log這個日志,每次超過2MB的時候,就會生成對應年-月的文件夾,和制定命名格式的log文件,而且是壓縮成gz格式文件,打開資源管理器發現這個文件只有11KB,解壓后就是2MB。

最后,希望這個教程能夠幫到大家!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久久久9999| 国产精品久久久久久av福利软件| 欧美孕妇性xx| 精品福利一区二区| 91亚洲精品久久久久久久久久久久| 久久久午夜视频| 欧美美女18p| 精品国产乱码久久久久久婷婷| 国产一区二区三区丝袜| 精品毛片三在线观看| 日韩一区二区三区xxxx| 91免费精品视频| 精品人伦一区二区三区蜜桃网站| 亚洲国产精品专区久久| 欧美人与物videos| 国产精品久久久久不卡| 欧美在线不卡区| 久久中文精品视频| 日韩欧美亚洲成人| 精品久久久久人成| 国内揄拍国内精品| 清纯唯美日韩制服另类| 国产日韩av高清| 成人在线中文字幕| 中文字幕亚洲无线码在线一区| 亚洲电影天堂av| 久久国产精品99国产精| 国产精品com| 国产成人福利网站| 国产精彩精品视频| 亚洲最大成人免费视频| 大胆人体色综合| 国产ts人妖一区二区三区| 91久久久精品| 亚洲伦理中文字幕| 国产精品美女久久久久av超清| 久久久久国产精品www| 精品国产自在精品国产浪潮| 国产精品网站入口| 欧美一级电影免费在线观看| 久久久久久国产精品美女| 精品国产91久久久久久| 欧美高跟鞋交xxxxhd| 国产精品吴梦梦| 高清一区二区三区日本久| 欧美日韩国产一区在线| 欧美三级欧美成人高清www| 91国产精品91| 欧美激情xxxx性bbbb| 欧美性极品xxxx做受| 2025国产精品视频| 国产在线精品自拍| 97精品一区二区视频在线观看| 久久av资源网站| 日韩av电影在线免费播放| …久久精品99久久香蕉国产| 久久五月天色综合| 日韩精品免费一线在线观看| 26uuu亚洲伊人春色| 中文字幕日韩视频| 国产精品伦子伦免费视频| 亚洲伊人成综合成人网| 久久国产精品久久国产精品| 日本一区二三区好的精华液| 欧美成人在线免费| 久久精品亚洲94久久精品| 日韩国产精品视频| 精品亚洲国产成av人片传媒| 欧美二区乱c黑人| 欧美性猛交xxxx乱大交极品| 欧美日韩国产123| 在线播放日韩专区| 97精品久久久| 亚洲xxx大片| 欧美激情奇米色| 亚洲人成网站777色婷婷| 国内精品伊人久久| 亚洲欧美三级伦理| 午夜精品蜜臀一区二区三区免费| 久久99视频精品| 一道本无吗dⅴd在线播放一区| 亚洲伊人久久大香线蕉av| 久久精品男人天堂| xvideos成人免费中文版| 国产免费成人av| 亚洲国产成人久久综合一区| 粗暴蹂躏中文一区二区三区| 中文字幕欧美精品日韩中文字幕| 色播久久人人爽人人爽人人片视av| 精品激情国产视频| 久久精品电影网| 欧美在线观看网址综合| 97超级碰在线看视频免费在线看| 国产精品嫩草影院一区二区| 亚洲精品久久久久中文字幕二区| 色婷婷亚洲mv天堂mv在影片| 亚洲第一视频网| 美女视频久久黄| 亚洲欧美日韩天堂一区二区| 国产成人精品最新| 日本欧美国产在线| 日韩综合视频在线观看| 色妞一区二区三区| 亚洲成人1234| 欧美日韩国产中文字幕| 久久99国产精品自在自在app| 国模精品系列视频| 久久琪琪电影院| 色综合久久天天综线观看| 日韩精品中文字| 亚洲精品成人久久| 国产婷婷97碰碰久久人人蜜臀| 国产精品第一页在线| 国产亚洲成av人片在线观看桃| 亚洲高清久久网| 亚洲国模精品一区| 久久久久中文字幕2018| 国产丝袜一区二区| 热re99久久精品国产66热| 亚洲视频在线播放| 亚洲永久免费观看| 日韩成人中文字幕在线观看| 成人xxxx视频| 国产成人精品一区| 国产精品自拍视频| 欧洲成人在线视频| 日本精品va在线观看| 精品网站999www| 国产日韩欧美日韩| 欧美激情a在线| 美女精品视频一区| 成人免费视频网| 国产亚洲一级高清| 欧美性黄网官网| 久久久亚洲精品视频| 欧美日韩亚洲视频一区| 一区二区在线视频播放| 欧美日韩人人澡狠狠躁视频| 日韩精品www| 91精品国产自产在线观看永久| 亚洲精品国产精品国自产在线| 欧美黑人视频一区| 亚洲欧美国产高清va在线播| 国产美女久久精品| 91精品国产高清自在线| 日韩免费看的电影电视剧大全| 最近更新的2019中文字幕| 亚洲一区二区三区视频播放| 久久久91精品国产一区不卡| 日韩av免费看网站| 国产精品情侣自拍| 日本a级片电影一区二区| 97久久超碰福利国产精品…| 欧美综合在线第二页| 欧美激情一二三| 国产日韩在线播放| 欧美性猛交xxxx久久久| 亚洲精品少妇网址| 亚洲成人网在线| 亚洲国产成人一区| 亚洲jizzjizz日本少妇| 在线看欧美日韩| 成人看片人aa| 国产精品白丝av嫩草影院|