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

   C++ 技術中心

   :: 首頁 :: 聯系 ::  :: 管理
  160 Posts :: 0 Stories :: 87 Comments :: 0 Trackbacks

公告

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

留言簿(27)

搜索

  •  

最新隨筆

最新評論

評論排行榜

一. 優先級控制
在研究LogLevelManager之前,首先介紹一下log4cplus中logger的存儲機制,在log4cplus中,
所有logger都通過一個層次化的結構(其實內部是hash表)來組織的,有一個Root級別的logger,
可以通過以下方法獲?。?br>Logger root = Logger::getRoot();

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

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

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

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


logger的這種父子關聯性會體現在優先級控制方面,log4cplus將輸出的log信息按照LogLevel(從低到高)分為:
NOT_SET_LOG_LEVEL (   -1)   :接受缺省的LogLevel,如果有父logger則繼承它的LogLevel
ALL_LOG_LEVEL           (    0)    :開放所有log信息輸出
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)  :關閉所有log信息輸出

LogLevelManager負責設置logger的優先級,各個logger可以通過setLogLevel設置自己的優先級,
當某個logger的LogLevel設置成NOT_SET_LOG_LEVEL時,該logger會繼承父logger的優先級,另外,
如果定義了重名的多個logger, 對其中任何一個的修改都會同時改變其它logger,我們舉例說明:

/*    
設置日志等級
*/

#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();

//設置優先級之前
//默認都是debug級別
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被設置警告優先級
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()));    

//設置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實例
cout << "create a logger test_bak, named \"test_\", too. " << endl;    
Logger test_bak 
= Logger::getInstance(LOG4CPLUS_TEXT("test"));    


//設置等級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;
}



/*    
設置日志等級,輸出對應等級的日志
*/

#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);    
   
   
//無等級,顯示所有的日志
   cout << endl << "all-log allowed" << endl;    
   root.setLogLevel(ALL_LOG_LEVEL);    
   ShowMsg();    
   
   
//顯示>=TRACE等級日志
   cout << endl << "trace-log and above allowed" << endl;    
   root.setLogLevel(TRACE_LOG_LEVEL);    
   ShowMsg();    
   
   
//顯示>=DEBUG等級日志
   cout << endl << "debug-log and above allowed" << endl;    
   root.setLogLevel(DEBUG_LOG_LEVEL);    
   ShowMsg();    
   
   
//顯示>=INFO等級日志
   cout << endl << "info-log and above allowed" << endl;    
   root.setLogLevel(INFO_LOG_LEVEL);    
   ShowMsg();    
   
   
//顯示>=WARN等級日志
   cout << endl << "warn-log and above allowed" << endl;    
   root.setLogLevel(WARN_LOG_LEVEL);    
   ShowMsg();    

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

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

    
return 0;
}


用戶也可以自行定義LogLevel,操作比較簡單,首先要定義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沒有提供給用戶一個接口來實現LEVEL值與字符串的轉換,所以當帶格式
輸出LogLevel字符串時候會顯示"UNKNOWN", 不夠理想。比如用TTCCLayout控制輸出的結果可能會如下所示:
10-17-04 11:17:51,124 [1075298944] UNKNOWN root <> - info
而不是期望的以下結果:
10-17-04 11:17:51,124 [1075298944] HELLO root <> - info

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

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

二. 基于腳本配置來過濾log信息
除了通過程序實現對log環境的配置之外,log4cplus通過PropertyConfigurator類實現了基于腳本配置的功能。
通過腳本可以完成對logger、appender和layout的配置,因此可以解決怎樣輸出,輸出到哪里的問題,我將在
全文的最后一部分中提到多線程環境中如何利用腳本配置來配合實現性能測試,本節將重點介紹基腳本實現過
濾log信息的功能。

首先簡單介紹一下腳本的語法規則:
包括Appender的配置語法和logger的配置語法,其中:
1.Appender的配置語法:
  (1)設置名稱:
     //設置方法
     log4cplus.appender.appenderName=fully.qualified.name.of.appender.class
 
    例如(列舉了所有可能的Appender,其中SocketAppender后面會講到):
    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)設置Filter:
    包括選擇過濾器和設置過濾條件,可選擇的過濾器包括:LogLevelMatchFilter、LogLevelRangeFilter、和StringMatchFilter:
   
    對LogLevelMatchFilter來說,過濾條件包括LogLevelToMatch和AcceptOnMatch(true|false),
    只有當log信息的LogLevel值與LogLevelToMatch相同,且AcceptOnMatch為true時才會匹配。
   
    LogLevelRangeFilter來說,過濾條件包括LogLevelMin、LogLevelMax和AcceptOnMatch,
    只有當log信息的LogLevel在LogLevelMin、LogLevelMax之間同時AcceptOnMatch為true時才會匹配。
   
    對StringMatchFilter來說,過濾條件包括StringToMatch和AcceptOnMatch,只有當log信息的LogLevel值
    與StringToMatch對應的LogLevel值與相同, 且AcceptOnMatch為true時會匹配。
   
    過濾條件處理機制類似于IPTABLE的Responsibility chain,(即先deny、再allow)不過執行順序剛好相反,
    后寫的條件會被先執行,比如:
    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
   
   
    會首先執行filters.2的過濾條件,關閉所有過濾器,然后執行filters.1,僅匹配TRACE信息。
    
    (3) 設置Layout可以選擇不設置、TTCCLayout、或PatternLayout如果不設置,
    會輸出簡單格式的log信息。設置TTCCLayout如下所示:
    log4cplus.appender.ALL_MSGS.layout=log4cplus::TTCCLayout
   
    設置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。
    對于rootLogger來說:log4cplus.rootLogger=[LogLevel], appenderName, appenderName, ...
    對于non-root logger來說:log4cplus.logger.logger_name=[LogLevel|INHERITED], appenderName, appenderName, ...

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


    補充說明: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

代碼示例如下:

/*    
設置日志等級,輸出對應等級的日志
*/

#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文件中寫入信息,因為向root,自動往所有的字文件寫入!");
    
    
//只向log4cplus.logger.trace_msgs      = TRACE,TRACE_MSGS對應的
    
//log4cplus.appender.TRACE_MSGS文件寫入日志
    Logger logger1 = Logger::getInstance(LOG4CPLUS_TEXT("TRACE_MSGS"));
    LOG4CPLUS_TRACE(logger1,
"只向all_msgs.log或trace_msgs.log文件寫入日志!");

    
return 0;
}

 
結果如下:
all_msgs.log:
10 [5840] FATAL root <> - 向所有的文件中寫入信息,因為向root,自動往所有的字文件寫入!
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++技術中心 閱讀(9601) 評論(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>
            亚洲国产老妈| 亚洲中午字幕| 亚洲国产美国国产综合一区二区 | 日韩视频一区二区| 欧美一区二区高清在线观看| 亚洲乱码国产乱码精品精98午夜| 性色av香蕉一区二区| 99视频国产精品免费观看| 欧美成人免费在线视频| 亚洲福利在线看| 免费视频一区| 美女露胸一区二区三区| 亚洲国产精品一区在线观看不卡| 久久亚洲欧洲| 久久影视精品| 亚洲国产精品999| 男人的天堂亚洲| 久久在线免费观看视频| 亚洲黄色影片| 亚洲精品美女91| 欧美日韩综合视频| 香蕉国产精品偷在线观看不卡| 夜夜嗨一区二区| 国产精品久久久久久久久久尿| 新片速递亚洲合集欧美合集| 亚洲欧美国产三级| 激情久久综艺| 亚洲韩国一区二区三区| 欧美视频在线观看 亚洲欧| 香蕉成人啪国产精品视频综合网| 欧美一区二区三区视频在线| 韩国美女久久| 欧美激情一区二区三区高清视频 | 国产日韩久久| 美女图片一区二区| 欧美日本免费一区二区三区| 亚洲中字在线| 欧美在线视频日韩| 亚洲精品欧美| 西西人体一区二区| 亚洲国产欧美不卡在线观看 | 国产女主播一区| 久久蜜桃香蕉精品一区二区三区| 久久综合久久久久88| 一区二区欧美日韩视频| 性欧美在线看片a免费观看| 亚洲第一区在线观看| 国产精品99久久久久久有的能看| 国内精品久久久久影院优| 亚洲高清在线| 国产欧美va欧美不卡在线| 欧美激情精品久久久| 国产精品美女久久久免费| 免费人成精品欧美精品| 国产精品久久国产精品99gif | 欧美在线观看www| 麻豆精品在线播放| 欧美与欧洲交xxxx免费观看| 欧美激情女人20p| 久久一区视频| 国产精品网站视频| 亚洲一级电影| 美女图片一区二区| 国产精品久久午夜夜伦鲁鲁| 欧美成人tv| 国产私拍一区| 一区二区三区日韩欧美精品| 亚洲欧洲在线观看| 欧美一区视频| 亚洲欧美久久| 欧美另类亚洲| 亚洲电影天堂av| 在线免费观看日韩欧美| 性欧美办公室18xxxxhd| 亚洲一区在线免费| 欧美另类高清视频在线| 亚洲第一精品久久忘忧草社区| 国产在线一区二区三区四区 | 国产欧美一区二区三区视频| 亚洲精品国产精品乱码不99按摩 | 欧美高清你懂得| 韩国av一区| 欧美主播一区二区三区| 久久成人在线| 国产亚洲成av人片在线观看桃| 亚洲美女精品一区| 99国内精品| 欧美精选在线| 亚洲精品久久久久| 亚洲美女精品成人在线视频| 免费人成网站在线观看欧美高清| 蜜桃av久久久亚洲精品| 18成人免费观看视频| 久久免费高清| 亚洲欧洲精品一区二区| 99re6这里只有精品| 欧美激情麻豆| 亚洲精品视频免费| 在线一区亚洲| 国产精品最新自拍| 久久精品99无色码中文字幕| 麻豆国产精品一区二区三区| 亚洲第一色在线| 欧美日韩免费观看一区二区三区| 妖精成人www高清在线观看| 午夜一级在线看亚洲| 国产综合精品| 欧美凹凸一区二区三区视频| 亚洲黄色三级| 亚洲女爱视频在线| 国产在线视频欧美一区二区三区| 久久综合狠狠综合久久综青草 | 欧美日韩视频在线一区二区观看视频 | 久久久国产成人精品| 久久欧美中文字幕| 亚洲免费不卡| 国产欧美日韩一区二区三区在线观看| 欧美亚洲在线播放| 欧美激情亚洲综合一区| 亚洲一区一卡| 在线观看欧美日韩| 欧美日本在线视频| 一区二区三区精品视频| 久久免费国产| 一区二区三区回区在观看免费视频| 欧美一级久久久久久久大片| 影音先锋中文字幕一区| 欧美日韩一区二区在线视频| 欧美一进一出视频| 亚洲精品欧洲| 久久精品青青大伊人av| 亚洲人成毛片在线播放女女| 国产精品wwwwww| 久久人人爽人人爽爽久久| 亚洲精品综合在线| 美日韩丰满少妇在线观看| 亚洲专区一区二区三区| 在线看无码的免费网站| 国产精品久久久99| 欧美bbbxxxxx| 久久精品视频免费播放| 99国产一区| 亚洲电影在线播放| 久久久久久一区| 亚洲一区在线视频| 日韩视频亚洲视频| 精品成人在线观看| 国产精品嫩草99a| 欧美三级欧美一级| 欧美激情精品久久久久久久变态| 欧美一区影院| 亚洲欧美美女| 一卡二卡3卡四卡高清精品视频| 麻豆9191精品国产| 久久黄色网页| 欧美一级大片在线免费观看| 99在线|亚洲一区二区| 亚洲国产清纯| 亚洲国产va精品久久久不卡综合| 国产欧美日韩在线| 国产视频亚洲精品| 国产精品免费看| 欧美午夜不卡在线观看免费 | 亚洲天堂偷拍| 亚洲免费高清| 91久久精品国产91久久| 免费欧美视频| 欧美大片在线影院| 美女诱惑一区| 欧美成人一品| 麻豆国产精品777777在线| 久久久噜噜噜久久久| 久久大逼视频| 久久精品二区亚洲w码| 欧美在线关看| 久久久久久香蕉网| 久久综合婷婷| 老牛国产精品一区的观看方式| 久久狠狠久久综合桃花| 久久久久国产精品厨房| 久久久久久电影| 蜜臀av国产精品久久久久| 欧美成人午夜视频| 亚洲区免费影片| 99精品免费网| 午夜精品久久久久久久99黑人| 亚洲欧美日韩网| 久久久午夜电影| 欧美r片在线| 欧美日韩国产影片| 国产精品国产三级国产aⅴ浪潮 | 欧美中文在线字幕| 国产综合色精品一区二区三区| 久久久天天操| 一本色道久久88亚洲综合88| 久久综合狠狠综合久久综合88| 亚洲图片欧美午夜| 亚洲国产精品久久| 黄色另类av| 影音先锋在线一区|