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

牽著老婆滿街逛

嚴(yán)以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

開源日志系統(tǒng)log4cplus(五)

日志系統(tǒng)的另一個(gè)基本功能就是能夠讓使用者按照自己的意愿來控制什么時(shí)候,哪些log信息可以輸出。
如果能夠讓用戶在任意時(shí)刻設(shè)置允許輸出的LogLevel的信息就好了,log4cplus通過LogLevelManager、
LogLog、Filter三種方式實(shí)現(xiàn)了上述功能。

				
### 優(yōu)先級(jí)控制 ###
在研究LogLevelManager之前,首先介紹一下log4cplus中l(wèi)ogger的存儲(chǔ)機(jī)制,在log4cplus中,所有
logger都通過一個(gè)層次化的結(jié)構(gòu)(其實(shí)內(nèi)部是hash表)來組織的,有一個(gè)Root級(jí)別的logger,可以通
過以下方法獲取:
??? 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,我們舉例說明:
〖例6〗
#include "log4cplus/logger.h"
#include "log4cplus/consoleappender.h"
#include "log4cplus/loglevel.h"
#include <iostream>
using namespace std;
using namespace log4cplus;
int main()
{
??? SharedAppenderPtr _append(new ConsoleAppender());
??? _append->setName("test");
??? Logger::getRoot().addAppender(_append);
??? Logger root = Logger::getRoot();
??? Logger test = Logger::getInstance("test");
??? Logger subTest = Logger::getInstance("test.subtest");
??? LogLevelManager& llm = getLogLevelManager();
??? 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()))
??? 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()))
??? 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;
??? 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')
??? cout << "create a logger test_bak, named \"test_\", too. " << endl;
??? Logger test_bak = Logger::getInstance("test");
??? 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()))
??? return 0;
}
輸出結(jié)果:
Before Setting, Default LogLevel
FATAL - root: DEBUG
FATAL - test: DEBUG
FATAL - test.subtest: DEBUG
Setting test.subtest to WARN
FATAL - root: DEBUG
FATAL - test: DEBUG
FATAL - test.subtest: WARN
Setting test.subtest to TRACE
FATAL - root: DEBUG
FATAL - test: TRACE
FATAL - test.subtest: WARN
Setting test.subtest to NO_LEVEL
FATAL - root: DEBUG
FATAL - test: TRACE
FATAL - test.subtest: TRACE
create a logger test_bak, named "test_", too.
Setting test to INFO, so test_bak also be set to INFO
FATAL - test: INFO
FATAL - test_bak: INFO
				
下面的例子演示了如何通過設(shè)置LogLevel來控制用戶的log信息輸出:
〖例7〗
#include "log4cplus/logger.h"
#include "log4cplus/consoleappender.h"
#include "log4cplus/loglevel.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 main()
{
??? SharedAppenderPtr _append(new ConsoleAppender());
??? _append->setName("test");
??? _append->setLayout(std::auto_ptr(new TTCCLayout()));
??? Logger root = Logger::getRoot();
??? root.addAppender(_append);
??? cout << endl << "all-log allowed" << endl;
??? root.setLogLevel(ALL_LOG_LEVEL);
??? ShowMsg();
??? cout << endl << "trace-log and above allowed" << endl;
??? root.setLogLevel(TRACE_LOG_LEVEL);
??? ShowMsg();
??? cout << endl << "debug-log and above allowed" << endl;
??? root.setLogLevel(DEBUG_LOG_LEVEL);
??? ShowMsg();
??? cout << endl << "info-log and above allowed" << endl;
??? root.setLogLevel(INFO_LOG_LEVEL);
??? ShowMsg();
??? cout << endl << "warn-log and above allowed" << endl;
??? root.setLogLevel(WARN_LOG_LEVEL);
??? ShowMsg();
??? cout << endl << "error-log and above allowed" << endl;
??? root.setLogLevel(ERROR_LOG_LEVEL);
??? ShowMsg();
??? 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();
??? return 0;
}
輸出結(jié)果:
all-log allowed
10-17-04 10:11:40,587 [1075298944] TRACE root <> - info
10-17-04 10:11:40,590 [1075298944] DEBUG root <> - info
10-17-04 10:11:40,591 [1075298944] INFO root <> - info
10-17-04 10:11:40,591 [1075298944] WARN root <> - info
10-17-04 10:11:40,592 [1075298944] ERROR root <> - info
10-17-04 10:11:40,592 [1075298944] FATAL root <> - info
trace-log and above allowed
10-17-04 10:11:40,593 [1075298944] TRACE root <> - info
10-17-04 10:11:40,593 [1075298944] DEBUG root <> - info
10-17-04 10:11:40,594 [1075298944] INFO root <> - info
10-17-04 10:11:40,594 [1075298944] WARN root <> - info
10-17-04 10:11:40,594 [1075298944] ERROR root <> - info
10-17-04 10:11:40,594 [1075298944] FATAL root <> - info
debug-log and above allowed
10-17-04 10:11:40,595 [1075298944] DEBUG root <> - info
10-17-04 10:11:40,595 [1075298944] INFO root <> - info
10-17-04 10:11:40,596 [1075298944] WARN root <> - info
10-17-04 10:11:40,596 [1075298944] ERROR root <> - info
10-17-04 10:11:40,596 [1075298944] FATAL root <> - info
info-log and above allowed
10-17-04 10:11:40,597 [1075298944] INFO root <> - info
10-17-04 10:11:40,597 [1075298944] WARN root <> - info
10-17-04 10:11:40,597 [1075298944] ERROR root <> - info
10-17-04 10:11:40,598 [1075298944] FATAL root <> - info
warn-log and above allowed
10-17-04 10:11:40,598 [1075298944] WARN root <> - info
10-17-04 10:11:40,598 [1075298944] ERROR root <> - info
10-17-04 10:11:40,599 [1075298944] FATAL root <> - info
error-log and above allowed
10-17-04 10:11:40,599 [1075298944] ERROR root <> - info
10-17-04 10:11:40,600 [1075298944] FATAL root <> - info
fatal-log and above allowed
10-17-04 10:11:40,600 [1075298944] FATAL root <> - info
log disabled
?
用戶也可以自行定義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)滿意效果。
				
### 調(diào)試模式 ###
即通過loglog來控制輸出調(diào)試、警告或錯(cuò)誤信息,見例4,這里不再贅述。
?
### 基于腳本配置來過濾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");
				
下面我們通過例子體會(huì)一下log4cplus強(qiáng)大的基于腳本過濾log信息的功能。
				
〖例8〗
/*
?*??? urconfig.properties
?*/
log4cplus.rootLogger=TRACE, ALL_MSGS, TRACE_MSGS, DEBUG_INFO_MSGS, 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
				
/*
?*??? main.cpp
?*/
#include <log4cplus/logger.h>
#include <log4cplus/configurator.h>
#include <log4cplus/helpers/stringhelper.h>
using namespace log4cplus;
static Logger logger = Logger::getInstance("log");
void printDebug()
{
??? LOG4CPLUS_TRACE_METHOD(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");
}
int main()
{
??? Logger root = Logger::getRoot();
??? PropertyConfigurator::doConfigure("urconfig.properties");
??? printDebug();
??? return 0;
}
運(yùn)行結(jié)果:
1. all_msgs.log
10-17-04 14:55:25,858 [1075298944] TRACE log <> - ENTER: ::printDebug()
10-17-04 14:55:25,871 [1075298944] DEBUG log <> - This is a DEBUG message
10-17-04 14:55:25,873 [1075298944] INFO log <> - This is a INFO message
10-17-04 14:55:25,873 [1075298944] WARN log <> - This is a WARN message
10-17-04 14:55:25,874 [1075298944] ERROR log <> - This is a ERROR message
10-17-04 14:55:25,874 [1075298944] FATAL log <> - This is a FATAL message
10-17-04 14:55:25,875 [1075298944] TRACE log <> - EXIT:? ::printDebug()
2. trace_msgs.log
10-17-04 14:55:25,858 [1075298944] TRACE log <> - ENTER: ::printDebug()
10-17-04 14:55:25,875 [1075298944] TRACE log <> - EXIT:? ::printDebug()
3. debug_info_msgs.log
10-17-04 14:55:25,871 [1075298944] DEBUG log <> - This is a DEBUG message
10-17-04 14:55:25,873 [1075298944] INFO log <> - This is a INFO message
4. fatal_msgs.log
10-17-04 14:55:25,874 [1075298944] FATAL log <> - This is a FATAL message
?
本部分詳細(xì)介紹了如何有選擇地控制log信息的輸出,最后一部分我們將介紹一下多線程、
和C/S模式下該如何操作,順便提一下NDC的概念。

posted on 2006-08-26 04:50 楊粼波 閱讀(8295) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Windows編程Linux編程

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲欧美日韩精品在线| 欧美手机在线| 韩国成人精品a∨在线观看| 亚洲婷婷在线| 久久久噜噜噜久久中文字幕色伊伊 | 欧美jizz19性欧美| 欧美一站二站| 国产日韩久久| 久久精品夜色噜噜亚洲a∨| 欧美h视频在线| 99精品欧美一区| 国产精品v欧美精品∨日韩| 久久精品国产欧美激情 | 99精品欧美一区二区三区综合在线 | 久久亚洲视频| 亚洲自拍偷拍色片视频| 国产噜噜噜噜噜久久久久久久久 | 久久午夜视频| 亚洲午夜一级| 欧美在线高清| 亚洲黄一区二区三区| 欧美激情精品久久久久| 午夜精品久久久久久久99水蜜桃 | 免费日韩一区二区| 久久成人精品电影| 亚洲精品中文在线| 国产日韩欧美| 亚洲欧洲精品天堂一级| 国产精品久久久久久久久久妞妞 | 亚洲高清免费在线| 一区二区三区不卡视频在线观看 | 日韩视频一区| 羞羞视频在线观看欧美| 一区二区欧美在线| 久久国产精品高清| 亚洲精品中文字幕有码专区| 美国三级日本三级久久99| 亚洲毛片一区二区| 久久美女性网| 国产欧美视频一区二区| 国产精品免费小视频| 亚洲人成网站精品片在线观看 | 亚洲高清资源| 国产欧美大片| 亚洲精品四区| 亚洲国产精品一区二区www| 久久av一区二区三区漫画| 蜜臀久久99精品久久久久久9| 亚洲精品资源| 久久一二三四| 韩国av一区二区| 欧美一区二区播放| 在线亚洲一区二区| 亚洲一区欧美激情| 性欧美精品高清| 欧美在线精品一区| 欧美视频一区二区| 夜夜爽夜夜爽精品视频| 亚洲一区二区3| 亚洲自拍高清| 99re8这里有精品热视频免费| 亚洲人永久免费| 99精品视频免费观看视频| 欧美成人午夜免费视在线看片| 免费的成人av| 欧美日韩一二区| 国产精品午夜电影| 亚洲欧洲午夜| 欧美激情在线狂野欧美精品| 亚洲国产精品视频| 亚洲一区二区久久| 国产精品日韩久久久久| 亚洲图片欧美午夜| 久久精品女人| 亚洲福利视频在线| 免费欧美网站| 99精品国产在热久久下载| 日韩一级视频免费观看在线| 欧美日韩一区二| 一本色道久久88综合日韩精品| 亚洲精品小视频在线观看| 欧美日韩在线播放三区四区| 亚洲欧美日本国产有色| 亚洲大胆美女视频| 亚洲视频电影图片偷拍一区| 国产精品扒开腿爽爽爽视频| 欧美伊人久久久久久久久影院| 欧美在线看片| 日韩视频中文字幕| 亚洲欧美日本国产有色| 欧美成人自拍视频| 一区二区三区欧美视频| 亚洲一区久久久| 在线播放中文一区| 性色av一区二区三区在线观看 | 久久精彩免费视频| 亚洲精品久久久久久久久久久| 亚洲精品乱码久久久久久按摩观| 国产精品久久久久久久久婷婷 | 欧美精品免费在线| 国产精品一区二区在线观看网站| 午夜欧美不卡精品aaaaa| 欧美国产视频一区二区| 欧美日韩国产色视频| 亚洲电影免费观看高清完整版| 亚洲一级电影| 久久本道综合色狠狠五月| 亚洲日韩欧美视频一区| 亚洲自拍都市欧美小说| 亚洲激情一区二区三区| 女同性一区二区三区人了人一| 欧美日本视频在线| 一本色道精品久久一区二区三区| 香港久久久电影| 99成人精品| 久久国产天堂福利天堂| 亚洲一区二区欧美日韩| 美女在线一区二区| 久久五月天婷婷| 国产人久久人人人人爽| 一本一本a久久| 国产精品久久久久毛片大屁完整版 | 亚洲黄色在线| 久久久九九九九| 欧美在线观看网址综合| 欧美私人啪啪vps| 亚洲精品国产精品国自产观看| 在线看欧美日韩| 久久久国际精品| 久久久91精品国产一区二区三区| 亚洲免费在线播放| 一区二区三区欧美日韩| 欧美激情一区二区久久久| 欧美国产日韩视频| 在线观看三级视频欧美| 欧美主播一区二区三区| 久久激情网站| 国产一区二区三区网站| 欧美va亚洲va日韩∨a综合色| 国产欧美日韩在线观看| 亚洲一区二区精品视频| 亚洲欧美日韩在线综合| 国产精品激情av在线播放| 久久精品女人的天堂av| 国产女主播视频一区二区| 午夜精品国产更新| 久久久另类综合| 一区在线免费| 一区二区三区高清在线观看| 99国产精品久久久久久久久久| 欧美激情一区二区三区不卡| 亚洲人成免费| 亚洲综合成人婷婷小说| 国产精品欧美日韩一区| 欧美亚洲一级| 在线天堂一区av电影| 欧美三日本三级三级在线播放| 国产精品99久久久久久白浆小说| 亚洲欧美在线一区二区| 国产欧美一区在线| 久久久天天操| 亚洲日本va午夜在线电影| 亚洲欧洲日本国产| 欧美日韩国产亚洲一区| 国产精品99久久久久久人| 欧美一区影院| 亚洲黄色有码视频| 欧美性猛交xxxx免费看久久久| 亚洲欧美亚洲| 欧美激情久久久久| 亚洲天堂视频在线观看| 国产一区免费视频| 中文国产成人精品| 久久成人精品| 亚洲理论电影网| 国产日产高清欧美一区二区三区| 久久成人免费视频| 亚洲免费观看| 久久噜噜亚洲综合| 在线一区二区三区四区五区| 国产午夜一区二区三区| 欧美日韩国产123| 欧美在线视频观看免费网站| 亚洲欧洲美洲综合色网| 久久国产直播| 亚洲视频一区二区| 亚洲韩国青草视频| 国产日韩欧美精品一区| 欧美精品在线视频观看| 欧美一区二区三区精品电影| 99热在这里有精品免费| 欧美sm视频| 久久久久一区二区三区| 亚洲尤物精选| 日韩视频免费观看高清在线视频 | 久久高清国产| 亚洲男人第一av网站| 亚洲日韩欧美视频一区| 激情文学综合丁香| 国产视频一区二区三区在线观看|