青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

   C++ 技術(shù)中心

   :: 首頁 :: 聯(lián)系 ::  :: 管理
  160 Posts :: 0 Stories :: 87 Comments :: 0 Trackbacks

公告

鄭重聲明:本BLOG所發(fā)表的原創(chuàng)文章,作者保留一切權(quán)利。必須經(jīng)過作者本人同意后方可轉(zhuǎn)載,并注名作者(天空)和出處(CppBlog.com)。作者Email:coder@luckcoder.com

留言簿(27)

搜索

  •  

最新隨筆

最新評(píng)論

評(píng)論排行榜

一. 優(yōu)先級(jí)控制
在研究LogLevelManager之前,首先介紹一下log4cplus中l(wèi)ogger的存儲(chǔ)機(jī)制,在log4cplus中,
所有l(wèi)ogger都通過一個(gè)層次化的結(jié)構(gòu)(其實(shí)內(nèi)部是hash表)來組織的,有一個(gè)Root級(jí)別的logger,
可以通過以下方法獲?。?br>Logger root = Logger::getRoot();

用戶定義的logger都有一個(gè)名字與之對(duì)應(yīng),比如:
Logger test = Logger::getInstance("test");

可以定義該logger的子logger:
Logger subTest = Logger::getInstance("test.subtest");   

注意:Root級(jí)別的logger只有通過getRoot方法獲取,Logger::getInstance("root")獲得的是它的子對(duì)象而已。

有了這些具有父子關(guān)系的logger之后可分別設(shè)置其LogLevel比如:
root.setLogLevel( ... );
test.setLogLevel( ... );
subTest.setLogLevel( ... );


logger的這種父子關(guān)聯(lián)性會(huì)體現(xiàn)在優(yōu)先級(jí)控制方面,log4cplus將輸出的log信息按照LogLevel(從低到高)分為:
NOT_SET_LOG_LEVEL (   -1)   :接受缺省的LogLevel,如果有父logger則繼承它的LogLevel
ALL_LOG_LEVEL           (    0)    :開放所有l(wèi)og信息輸出
TRACE_LOG_LEVEL     (    0)    :開放trace信息輸出(即ALL_LOG_LEVEL)
DEBUG_LOG_LEVEL    (10000) :開放debug信息輸出
INFO_LOG_LEVEL        (20000) :開放info信息輸出
WARN_LOG_LEVEL     (30000) :開放warning信息輸出
ERROR_LOG_LEVEL    (40000) :開放error信息輸出
FATAL_LOG_LEVEL    (50000)  :開放fatal信息輸出
OFF_LOG_LEVEL        (60000)  :關(guān)閉所有l(wèi)og信息輸出

LogLevelManager負(fù)責(zé)設(shè)置logger的優(yōu)先級(jí),各個(gè)logger可以通過setLogLevel設(shè)置自己的優(yōu)先級(jí),
當(dāng)某個(gè)logger的LogLevel設(shè)置成NOT_SET_LOG_LEVEL時(shí),該logger會(huì)繼承父logger的優(yōu)先級(jí),另外,
如果定義了重名的多個(gè)logger, 對(duì)其中任何一個(gè)的修改都會(huì)同時(shí)改變其它logger,我們舉例說明:

/*    
設(shè)置日志等級(jí)
*/

#include 
"stdafx.h"
#pragma comment(lib,
"../bin/log4cplusD.lib")



#include 
<log4cplus/logger.h>
#include 
<log4cplus/fileappender.h>
#include 
<log4cplus/consoleappender.h>
#include 
<conio.h>
#include 
<iostream>

using namespace std;
using namespace log4cplus;
int _tmain(int argc, _TCHAR* argv[]){   

SharedAppenderPtr _append(
new ConsoleAppender());   
_append
->setName(LOG4CPLUS_TEXT("test"));   

//新建test logger以及test的子subtest logger
Logger::getRoot().addAppender(_append);
Logger root 
= Logger::getRoot();
Logger test 
= Logger::getInstance(LOG4CPLUS_TEXT("test"));    
Logger subTest 
= Logger::getInstance(LOG4CPLUS_TEXT("test.subtest"));    
LogLevelManager
& llm = getLogLevelManager();

//設(shè)置優(yōu)先級(jí)之前
//默認(rèn)都是debug級(jí)別
cout << endl << "Before Setting, Default LogLevel" << endl;    
LOG4CPLUS_FATAL(root, 
"root: " << llm.toString(root.getChainedLogLevel()));   
LOG4CPLUS_FATAL(root, 
"test: " << llm.toString(test.getChainedLogLevel()));    
LOG4CPLUS_FATAL(root, 
"test.subtest: " << llm.toString(subTest.getChainedLogLevel()));    


//subTest被設(shè)置警告優(yōu)先級(jí)
cout << endl << "Setting test.subtest to WARN" << endl;   
subTest.setLogLevel(WARN_LOG_LEVEL);    
LOG4CPLUS_FATAL(root, 
"root: " << llm.toString(root.getChainedLogLevel()));   
LOG4CPLUS_FATAL(root, 
"test: " << llm.toString(test.getChainedLogLevel()));    
LOG4CPLUS_FATAL(root, 
"test.subtest: " << llm.toString(subTest.getChainedLogLevel()));    

//設(shè)置TRACE
cout << endl << "Setting test.subtest to TRACE" << endl;    
test.setLogLevel(TRACE_LOG_LEVEL);    
LOG4CPLUS_FATAL(root, 
"root: " << llm.toString(root.getChainedLogLevel()));    
LOG4CPLUS_FATAL(root, 
"test: " << llm.toString(test.getChainedLogLevel()));    
LOG4CPLUS_FATAL(root, 
"test.subtest: " << llm.toString(subTest.getChainedLogLevel()));    
cout 
<< endl << "Setting test.subtest to NO_LEVEL" << endl;    

//NOT_SET_LOG_LEVEL
subTest.setLogLevel(NOT_SET_LOG_LEVEL);    
LOG4CPLUS_FATAL(root, 
"root: " << llm.toString(root.getChainedLogLevel()));    
LOG4CPLUS_FATAL(root, 
"test: " << llm.toString(test.getChainedLogLevel()));    
LOG4CPLUS_FATAL(root, 
"test.subtest: " << llm.toString(subTest.getChainedLogLevel()) << '\n') ;   

//重新獲取test實(shí)例
cout << "create a logger test_bak, named \"test_\", too. " << endl;    
Logger test_bak 
= Logger::getInstance(LOG4CPLUS_TEXT("test"));    


//設(shè)置等級(jí)INFO_LOG_LEVEL
cout << "Setting test to INFO, so test_bak also be set to INFO" << endl;    
test.setLogLevel(INFO_LOG_LEVEL);    
LOG4CPLUS_FATAL(root, 
"test: " << llm.toString(test.getChainedLogLevel()));    
LOG4CPLUS_FATAL(root, 
"test_bak: " << llm.toString(test_bak.getChainedLogLevel()));   

_getch();

return 0;
}



/*    
設(shè)置日志等級(jí),輸出對(duì)應(yīng)等級(jí)的日志
*/

#include 
"stdafx.h"
#pragma comment(lib,
"../bin/log4cplusD.lib")

#include 
<log4cplus/logger.h>
#include 
<log4cplus/fileappender.h>
#include 
<log4cplus/consoleappender.h>
#include 
<conio.h>
#include 
<iostream>

using namespace std;
using namespace log4cplus;

void ShowMsg(void)
{   
    LOG4CPLUS_TRACE(Logger::getRoot(),
"info");
    LOG4CPLUS_DEBUG(Logger::getRoot(),
"info");
    LOG4CPLUS_INFO(Logger::getRoot(),
"info");
    LOG4CPLUS_WARN(Logger::getRoot(),
"info");
    LOG4CPLUS_ERROR(Logger::getRoot(),
"info");
    LOG4CPLUS_FATAL(Logger::getRoot(),
"info");
}



int _tmain(int argc, _TCHAR* argv[]){   

   SharedAppenderPtr _append(
new ConsoleAppender());
   _append
->setName(LOG4CPLUS_TEXT("test"));   
   
//std::auto_ptr<Layout> _layout(new TTCCLayout());
   
//_append->setLayout(_layout);
   _append->setLayout(std::auto_ptr<TTCCLayout>(new TTCCLayout()));
   Logger root 
= Logger::getRoot();
   root.addAppender(_append);    
   
   
//無等級(jí),顯示所有的日志
   cout << endl << "all-log allowed" << endl;    
   root.setLogLevel(ALL_LOG_LEVEL);    
   ShowMsg();    
   
   
//顯示>=TRACE等級(jí)日志
   cout << endl << "trace-log and above allowed" << endl;    
   root.setLogLevel(TRACE_LOG_LEVEL);    
   ShowMsg();    
   
   
//顯示>=DEBUG等級(jí)日志
   cout << endl << "debug-log and above allowed" << endl;    
   root.setLogLevel(DEBUG_LOG_LEVEL);    
   ShowMsg();    
   
   
//顯示>=INFO等級(jí)日志
   cout << endl << "info-log and above allowed" << endl;    
   root.setLogLevel(INFO_LOG_LEVEL);    
   ShowMsg();    
   
   
//顯示>=WARN等級(jí)日志
   cout << endl << "warn-log and above allowed" << endl;    
   root.setLogLevel(WARN_LOG_LEVEL);    
   ShowMsg();    

   
//顯示>=ERROR等級(jí)日志
   cout << endl << "error-log and above allowed" << endl;    
   root.setLogLevel(ERROR_LOG_LEVEL);    
   ShowMsg();    

   
//顯示>=FATAL等級(jí)日志
   cout << endl << "fatal-log and above allowed" << endl;    
   root.setLogLevel(FATAL_LOG_LEVEL);    
   ShowMsg();    
   
   
//關(guān)閉所有日志輸出
   cout << endl << "log disabled" << endl;    
   root.setLogLevel(OFF_LOG_LEVEL);    
   ShowMsg();    
 
    _getch();

    
return 0;
}


用戶也可以自行定義LogLevel,操作比較簡(jiǎn)單,首先要定義LEVEL值,比如HELLO_LOG_LEVEL定義如下:
//DEBUG_LOG_LEVEL  < HELLO_LOG_LEVEL < INFO_LOG_LEVEL

const LogLevel HELLO_LOG_LEVEL = 15000;
然后定義以下宏即可:

// define MACRO LOG4CPLUS_HELLO
#define LOG4CPLUS_HELLO(logger, logEvent) \    
if(logger.isEnabledFor(HELLO_LOG_LEVEL)) { \        
log4cplus::tostringstream _log4cplus_buf; \        
_log4cplus_buf 
<< logEvent; \ 
logger.forcedLog(HELLO_LOG_LEVEL, _log4cplus_buf.str(), __FILE__, __LINE__); \    
}


不過log4cplus沒有提供給用戶一個(gè)接口來實(shí)現(xiàn)LEVEL值與字符串的轉(zhuǎn)換,所以當(dāng)帶格式
輸出LogLevel字符串時(shí)候會(huì)顯示"UNKNOWN", 不夠理想。比如用TTCCLayout控制輸出的結(jié)果可能會(huì)如下所示:
10-17-04 11:17:51,124 [1075298944] UNKNOWN root <> - info
而不是期望的以下結(jié)果:
10-17-04 11:17:51,124 [1075298944] HELLO root <> - info

要想實(shí)現(xiàn)第二種結(jié)果,按照log4cplus現(xiàn)有的接口機(jī)制,只能改其源代碼后重新編譯,方法是在loglevel.cxx中加入:
#define _HELLO_STRING LOG4CPLUS_TEXT("HELLO")
然后修改log4cplus::tstring  defaultLogLevelToStringMethod(LogLevel ll)函數(shù),增加一個(gè)判斷:
case HELLO_LOG_LEVEL:   
  return _HELLO_STRING;

重新編譯log4cplus源代碼后生成庫文件,再使用時(shí)即可實(shí)現(xiàn)滿意效果。

二. 基于腳本配置來過濾log信息
除了通過程序?qū)崿F(xiàn)對(duì)log環(huán)境的配置之外,log4cplus通過PropertyConfigurator類實(shí)現(xiàn)了基于腳本配置的功能。
通過腳本可以完成對(duì)logger、appender和layout的配置,因此可以解決怎樣輸出,輸出到哪里的問題,我將在
全文的最后一部分中提到多線程環(huán)境中如何利用腳本配置來配合實(shí)現(xiàn)性能測(cè)試,本節(jié)將重點(diǎn)介紹基腳本實(shí)現(xiàn)過
濾log信息的功能。

首先簡(jiǎn)單介紹一下腳本的語法規(guī)則:
包括Appender的配置語法和logger的配置語法,其中:
1.Appender的配置語法:
  (1)設(shè)置名稱:
     //設(shè)置方法
     log4cplus.appender.appenderName=fully.qualified.name.of.appender.class
 
    例如(列舉了所有可能的Appender,其中SocketAppender后面會(huì)講到):
    log4cplus.appender.append_1=log4cplus::ConsoleAppender
    log4cplus.appender.append_2=log4cplus::FileAppender
    log4cplus.appender.append_3=log4cplus::RollingFileAppender
    log4cplus.appender.append_4=log4cplus::DailyRollingFileAppender
    log4cplus.appender.append_4=log4cplus::SocketAppender
 
  (2)設(shè)置Filter:
    包括選擇過濾器和設(shè)置過濾條件,可選擇的過濾器包括:LogLevelMatchFilter、LogLevelRangeFilter、和StringMatchFilter:
   
    對(duì)LogLevelMatchFilter來說,過濾條件包括LogLevelToMatch和AcceptOnMatch(true|false),
    只有當(dāng)log信息的LogLevel值與LogLevelToMatch相同,且AcceptOnMatch為true時(shí)才會(huì)匹配。
   
    LogLevelRangeFilter來說,過濾條件包括LogLevelMin、LogLevelMax和AcceptOnMatch,
    只有當(dāng)log信息的LogLevel在LogLevelMin、LogLevelMax之間同時(shí)AcceptOnMatch為true時(shí)才會(huì)匹配。
   
    對(duì)StringMatchFilter來說,過濾條件包括StringToMatch和AcceptOnMatch,只有當(dāng)log信息的LogLevel值
    與StringToMatch對(duì)應(yīng)的LogLevel值與相同, 且AcceptOnMatch為true時(shí)會(huì)匹配。
   
    過濾條件處理機(jī)制類似于IPTABLE的Responsibility chain,(即先deny、再allow)不過執(zhí)行順序剛好相反,
    后寫的條件會(huì)被先執(zhí)行,比如:
    log4cplus.appender.append_1.filters.1=log4cplus::spi::LogLevelMatchFilter
    log4cplus.appender.append_1.filters.1.LogLevelToMatch=TRACE
    log4cplus.appender.append_1.filters.1.AcceptOnMatch=true
    #log4cplus.appender.append_1.filters.2=log4cplus::spi::DenyAllFilter
   
   
    會(huì)首先執(zhí)行filters.2的過濾條件,關(guān)閉所有過濾器,然后執(zhí)行filters.1,僅匹配TRACE信息。
    
    (3) 設(shè)置Layout可以選擇不設(shè)置、TTCCLayout、或PatternLayout如果不設(shè)置,
    會(huì)輸出簡(jiǎn)單格式的log信息。設(shè)置TTCCLayout如下所示:
    log4cplus.appender.ALL_MSGS.layout=log4cplus::TTCCLayout
   
    設(shè)置PatternLayout如下所示:
    log4cplus.appender.append_1.layout=log4cplus::PatternLayout
    log4cplus.appender.append_1.layout.ConversionPattern=%d{%m/%d/%y %H:%M:%S,%Q} [%t] %-5p - %m%n
   
2.logger的配置語法
    包括rootLogger和non-root logger。
    對(duì)于rootLogger來說:log4cplus.rootLogger=[LogLevel], appenderName, appenderName, ...
    對(duì)于non-root logger來說:log4cplus.logger.logger_name=[LogLevel|INHERITED], appenderName, appenderName, ...

    腳本方式使用起來非常簡(jiǎn)單,只要首先加載配置即可(urconfig.properties是自行定義的配置文件):
    PropertyConfigurator::doConfigure("urconfig.properties");


    補(bǔ)充說明:log4cplus.additivity.logger_name表示表示是否繼承父類的配置

3. 示例:
配置文件如下:

log4cplus.rootLogger=TRACE, ALL_MSGS, TRACE_MSGS, DEBUG_INFO_MSGS, FATAL_MSGS

#trace_msgs將可以通過Logger::getInstance(LOG4CPLUS_TEXT("trace_msgs"))獲取
log4cplus.logger.trace_msgs      = TRACE,TRACE_MSGS
log4cplus.logger.debug_info_msgs = TRACE,DEBUG_INFO_MSGS
log4cplus.logger.fatal_msgs      = TRACE,FATAL_MSGS

log4cplus.appender.ALL_MSGS=log4cplus::RollingFileAppender
log4cplus.appender.ALL_MSGS.File=all_msgs.log
log4cplus.appender.ALL_MSGS.layout=log4cplus::TTCCLayout

log4cplus.appender.TRACE_MSGS=log4cplus::RollingFileAppender
log4cplus.appender.TRACE_MSGS.File=trace_msgs.log
log4cplus.appender.TRACE_MSGS.layout=log4cplus::TTCCLayout
log4cplus.appender.TRACE_MSGS.filters.1=log4cplus::spi::LogLevelMatchFilter
log4cplus.appender.TRACE_MSGS.filters.1.LogLevelToMatch=TRACE
log4cplus.appender.TRACE_MSGS.filters.1.AcceptOnMatch=true
log4cplus.appender.TRACE_MSGS.filters.2=log4cplus::spi::DenyAllFilter

log4cplus.appender.DEBUG_INFO_MSGS=log4cplus::RollingFileAppender
log4cplus.appender.DEBUG_INFO_MSGS.File=debug_info_msgs.log
log4cplus.appender.DEBUG_INFO_MSGS.layout=log4cplus::TTCCLayout
log4cplus.appender.DEBUG_INFO_MSGS.filters.1=log4cplus::spi::LogLevelRangeFilter
log4cplus.appender.DEBUG_INFO_MSGS.filters.1.LogLevelMin=DEBUG
log4cplus.appender.DEBUG_INFO_MSGS.filters.1.LogLevelMax=INFO
log4cplus.appender.DEBUG_INFO_MSGS.filters.1.AcceptOnMatch=true
log4cplus.appender.DEBUG_INFO_MSGS.filters.2=log4cplus::spi::DenyAllFilter

log4cplus.appender.FATAL_MSGS=log4cplus::RollingFileAppender
log4cplus.appender.FATAL_MSGS.File=fatal_msgs.log
log4cplus.appender.FATAL_MSGS.layout=log4cplus::TTCCLayout
log4cplus.appender.FATAL_MSGS.filters.1=log4cplus::spi::StringMatchFilter
log4cplus.appender.FATAL_MSGS.filters.1.StringToMatch=FATAL
log4cplus.appender.FATAL_MSGS.filters.1.AcceptOnMatch=true
log4cplus.appender.FATAL_MSGS.filters.2=log4cplus::spi::DenyAllFilter

代碼示例如下:

/*    
設(shè)置日志等級(jí),輸出對(duì)應(yīng)等級(jí)的日志
*/

#include 
"stdafx.h"
#pragma comment(lib,
"../bin/log4cplusD.lib")

#include 
<log4cplus/logger.h>
#include 
<log4cplus/fileappender.h>
#include 
<log4cplus/consoleappender.h>
#include 
<conio.h>
#include 
<iostream>
#include 
<log4cplus/configurator.h>

using namespace std;
using namespace log4cplus;

static Logger logger1 = Logger::getInstance(LOG4CPLUS_TEXT("TRACE_MSGS"));
static Logger logger2 = Logger::getInstance(LOG4CPLUS_TEXT("log"));

void printDebug(){    
/*    LOG4CPLUS_TRACE(logger, "::printDebug()");    
    LOG4CPLUS_DEBUG(logger, "This is a DEBUG message");    
    LOG4CPLUS_INFO(logger, "This is a INFO message");    
    LOG4CPLUS_WARN(logger, "This is a WARN message");   
    LOG4CPLUS_ERROR(logger, "This is a ERROR message");    
    LOG4CPLUS_FATAL(logger, "This is a FATAL message");
    
*/


    LOG4CPLUS_TRACE(logger1, 
"::printDebug()"); 

}


int _tmain(int argc, _TCHAR* argv[]){   


    
//    
    PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT("urconfig.properties"));    
    

    
//入root的logger寫入記錄
    Logger root = Logger::getRoot();
    LOG4CPLUS_FATAL(root,
"向all_msgs.log文件中寫入信息,因?yàn)橄騬oot,自動(dòng)往所有的字文件寫入!");
    
    
//只向log4cplus.logger.trace_msgs      = TRACE,TRACE_MSGS對(duì)應(yīng)的
    
//log4cplus.appender.TRACE_MSGS文件寫入日志
    Logger logger1 = Logger::getInstance(LOG4CPLUS_TEXT("TRACE_MSGS"));
    LOG4CPLUS_TRACE(logger1,
"只向all_msgs.log或trace_msgs.log文件寫入日志!");

    
return 0;
}

 
結(jié)果如下:
all_msgs.log:
10 [5840] FATAL root <> - 向所有的文件中寫入信息,因?yàn)橄騬oot,自動(dòng)往所有的字文件寫入!
10 [5840] TRACE TRACE_MSGS <> - 只向trace_msgs.log文件寫入日志!


trace_msgs.log:
10 [5840] TRACE TRACE_MSGS <> - 只向trace_msgs.log文件寫入日志!

其他文件為空

posted on 2011-04-02 16:00 C++技術(shù)中心 閱讀(9607) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 三方庫
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            美女视频黄 久久| 午夜一级久久| 久久久久看片| 蜜桃av噜噜一区| 91久久综合| 麻豆9191精品国产| 欧美视频免费在线| 欧美一区综合| 美女脱光内衣内裤视频久久网站| 亚洲欧洲精品一区二区| 欧美国产1区2区| 欧美日韩在线观看视频| 久久综合九色九九| 久久人人爽国产| 欧美激情中文不卡| 午夜一区二区三视频在线观看 | 亚洲区国产区| 欧美日韩在线看| 欧美福利在线| 欧美一区二区成人6969| 亚洲欧美国产三级| 亚洲欧美成人在线| 午夜精品久久久久久| 午夜精品久久久久久久久久久 | 欧美色精品在线视频| 欧美乱妇高清无乱码| 精品二区久久| 亚洲午夜精品久久久久久浪潮| 亚洲国产欧美国产综合一区| 亚洲自拍电影| 一区二区三区蜜桃网| 欧美一级大片在线观看| 午夜精品国产更新| 欧美绝品在线观看成人午夜影视 | 国产精品99久久久久久白浆小说| 欧美一区亚洲二区| 亚洲制服欧美中文字幕中文字幕| 亚洲伦理中文字幕| 136国产福利精品导航网址应用 | 美女日韩欧美| 欧美一区二区女人| 久久综合久久综合这里只有精品| 蜜桃精品一区二区三区 | 欧美三区美女| 欧美大片一区| 男女激情久久| 久久亚洲国产精品一区二区| 久久成人免费网| 欧美专区在线播放| 久久精品国产综合精品| 午夜在线观看欧美| 欧美一区二区三区播放老司机| 亚洲午夜电影网| 午夜精品福利在线| 久久爱www久久做| 久久综合狠狠综合久久激情| 久久久亚洲精品一区二区三区| 久久久精品欧美丰满| 美女网站在线免费欧美精品| 欧美福利一区| 国产精品mm| 韩国成人精品a∨在线观看| 国模叶桐国产精品一区| 亚洲电影下载| 亚洲手机视频| 久久国产福利| 91久久精品日日躁夜夜躁欧美| 最新69国产成人精品视频免费| 一区二区三区不卡视频在线观看| 亚洲女同同性videoxma| 久久久久国产精品人| 欧美精品国产精品| 国产一区二区黄| 亚洲美女视频网| 久久久久成人精品| 亚洲欧洲精品成人久久奇米网| 亚洲欧美日韩国产一区二区| 另类人畜视频在线| 国产伦精品一区二区三区| 欧美性猛交xxxx乱大交蜜桃| 欧美高清视频一二三区| 欧美午夜精品久久久久免费视| 亚洲精品永久免费| 亚洲国产成人久久综合一区| 亚洲人线精品午夜| 久久亚裔精品欧美| 亚洲人成网站999久久久综合| 久久久99久久精品女同性| 亚洲大胆女人| 精品51国产黑色丝袜高跟鞋| 在线观看91精品国产麻豆| 精品福利电影| 亚洲黄色影院| 亚洲欧美日韩国产中文| 久久精品国产久精国产爱| 亚洲一区久久| 亚洲综合色视频| 亚洲美女视频网| 一本久久综合亚洲鲁鲁五月天| 99精品福利视频| 久久综合久久综合这里只有精品| 久久久久久9| 亚洲一区尤物| 久久精品国产清高在天天线| 亚洲性图久久| 99re热这里只有精品视频| 一区在线电影| 国产精品主播| 亚洲国产成人精品女人久久久| 亚洲国产精品美女| 亚洲在线电影| 欧美激情第二页| 中文欧美字幕免费| 乱中年女人伦av一区二区| 欧美揉bbbbb揉bbbbb| 国产精品丝袜91| 亚洲深夜福利在线| 欧美中文在线视频| 欧美午夜片在线观看| 亚洲欧美另类在线观看| 欧美一区=区| 永久久久久久| 亚洲精品久久久久久久久| 欧美三级电影精品| 欧美在线首页| 久久综合久久久| 一区二区三区国产| 亚洲视频在线一区| 狠狠色伊人亚洲综合成人| 亚洲国产一区二区视频| 欧美亚洲第一区| 欧美中文在线视频| 国产精品女人毛片| 久久久久久欧美| 久热精品在线视频| 国产日本亚洲高清| 一本在线高清不卡dvd| 欧美一站二站| 日韩视频在线一区二区| 欧美国产激情二区三区| 亚洲福利专区| 欧美国产成人精品| 欧美成人中文| 亚洲欧美日韩另类| 免费人成精品欧美精品| 欧美在线视频一区二区| 免费在线观看日韩欧美| 在线精品视频在线观看高清| 久久人人爽爽爽人久久久| 欧美一区二区三区成人| 亚洲国产成人精品视频| 久久精品日韩| 香蕉久久a毛片| 欧美日产在线观看| 国产亚洲精品福利| 一区二区三区视频观看| 亚洲国内自拍| 欧美精品 日韩| 亚洲无线观看| 亚洲欧美卡通另类91av| 在线欧美日韩精品| 欧美激情aaaa| 国产老女人精品毛片久久| 久久色在线播放| 欧美激情一区二区三级高清视频| 亚洲一区二区在线| 亚洲欧美另类在线观看| 99re6热只有精品免费观看 | 亚洲另类春色国产| 激情五月婷婷综合| 亚洲成人自拍视频| 国产欧美日韩91| 日韩午夜av| 久久九九热re6这里有精品 | 欧美一级艳片视频免费观看| 在线观看三级视频欧美| 999亚洲国产精| 亚洲国产91精品在线观看| 亚洲影院一区| 亚洲日本免费| 欧美专区在线播放| 午夜性色一区二区三区免费视频| 久久性天堂网| 亚洲电影有码| 久久精品理论片| 午夜亚洲精品| 国产精品乱码人人做人人爱| 亚洲精品社区| 一本一本久久a久久精品牛牛影视| 久久婷婷丁香| 欧美a级理论片| 精品电影在线观看| 亚洲欧美一区二区精品久久久| 久久中文精品| 麻豆乱码国产一区二区三区| 国产亚洲福利一区| 欧美一级欧美一级在线播放| 欧美影院精品一区| 国产精品日本一区二区| 亚洲一区二区欧美日韩|