精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

【博文推薦 】 python Howto之logging模塊

開發(fā) 后端
我們不要通過logging.Logger來直接實(shí)例化得到logger,而是需要通過logging.getLogger("name")來生成logger對(duì)象。
 本博文出自51CTO博客無(wú)名博主,有任何問題請(qǐng)進(jìn)入博主頁(yè)面互動(dòng)討論!
博文地址:http://xdzw608.blog.51cto.com/4812210/1608718

本文來源于對(duì)py2.7.9 docs中howto-logging部分加之源代碼的理解。官方文檔鏈接如下,我用的是下載的pdf版本,應(yīng)該是一致的:https://docs.python.org/2/howto/logging.html

我們不按照文檔上由淺入深的講解順序,因?yàn)榫瓦@么點(diǎn)東西不至于有“入”這個(gè)動(dòng)作。

使用logging模塊記錄日志涉及四個(gè)主要類,使用官方文檔中的概括最為合適:

logger提供了應(yīng)用程序可以直接使用的接口;

handler將(logger創(chuàng)建的)日志記錄發(fā)送到合適的目的輸出;

filter提供了細(xì)度設(shè)備來決定輸出哪條日志記錄;

formatter決定日志記錄的最終輸出格式。

寫log的一般順序?yàn)椋?/strong>

一、創(chuàng)建logger:

我們不要通過logging.Logger來直接實(shí)例化得到logger,而是需要通過logging.getLogger("name")來生成logger對(duì)象。

不 是說我們不能實(shí)現(xiàn)Logger的實(shí)例化,而是我們期待的是同一個(gè)name得到的是同一個(gè)logger,這樣多模塊之間可以共同使用同一個(gè) logger,getLogger正是這樣的解決方案,它內(nèi)部使用loggerDict字典來維護(hù),可以保證相同的名字作為key會(huì)得到同一個(gè) logger對(duì)象。我們可以通過實(shí)例來驗(yàn)證一下:

  1. #test_logger1.py 
  2.  
  3. #coding:utf-8 
  4.  
  5. import logging 
  6.  
  7. print logging.getLogger("mydear"
  8.  
  9. import test_logger2 
  10.  
  11. test_logger2.run()   #調(diào)用文件2中的函數(shù),保證兩個(gè)模塊共同處于生存期 
  12.  
  13. #test_logger2.py 
  14.  
  15. #coding:utf-8 
  16.   
  17. import logging 
  18.  
  19. def run(): 
  20.  
  21. print logging.getLogger("mydear"

輸出:

<logging.Logger object at 0x00000000020ECF28>
<logging.Logger object at 0x00000000020ECF28>

結(jié)果表明兩個(gè)文件中通過"mydear"調(diào)用getLogger可以保證得到的logger對(duì)象是同一個(gè)。而分別進(jìn)行Logger類的實(shí)例化則不能保證。

有了logger之后就可以配置這個(gè)logger,例如設(shè)置日志級(jí)別setLevel,綁定控制器addHandler,添加過濾器addFilter等。

配置完成后,就可以調(diào)用logger的方法寫日志了,根據(jù)5個(gè)日志級(jí)別對(duì)應(yīng)有5個(gè)日志記錄方法,分別為logger.debug,logger.info,logger.warning,logger.error,logger.critical。 

二、配置Logger對(duì)象的日志級(jí)別:

logger.setLevel(logging.DEBUG)  #DEBUG以上的日志級(jí)別會(huì)被此logger處理 

三、創(chuàng)建handler對(duì)象

handler 負(fù)責(zé)將log分發(fā)到某個(gè)目的輸出,存在多種內(nèi)置的Handler將log分發(fā)到不同的目的地,或是控制臺(tái),或是文件,或是某種形式的stream,或是 socket等。一個(gè)logger可以綁定多個(gè)handler,例如,一條日志可以同時(shí)輸出到控制臺(tái)和文件中。

以FileHandler和StreamHandler為例:

logfile= logging.FileHandler("./log.txt")  #創(chuàng)建一個(gè)handler,用于將日志輸出到文件中   

console = logging.StreamHandler() #創(chuàng)建另一個(gè)handler,將日志導(dǎo)向流

    handler對(duì)象也需要設(shè)置日志級(jí)別,由于一個(gè)logger可以包含多個(gè)handler,所以每個(gè)handler設(shè)置日志級(jí)別是有必要的。用通俗的話 講,比如,我們需要處理debug以上級(jí)別的消息,所以我們將logger的日志級(jí)別定為DEBUG;然后我們想把error以上的日志輸出到控制臺(tái),而 DEBUG以上的消息輸出到文件中,這種分流就需要兩個(gè)Handler來控制。

logfile.setLevel(logging.DEBUG)

console.setLevel(logging.ERROR)

除了對(duì)handler對(duì)象設(shè)置日志級(jí)別外,還可以指定formatter,即日志的輸出格式。對(duì)handler對(duì)象設(shè)置日志格式,說明了可以將一條記錄以不同的格式輸出到控制臺(tái),文件或其他目的地。

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

logfile.setFormatter(formatter) #設(shè)置handler的日志輸出格式

formatter創(chuàng)建時(shí)使用的關(guān)鍵字,***會(huì)以列表的形式展現(xiàn),這不是重點(diǎn)。

四、綁定handler到logger中

至此handlers和logger已經(jīng)準(zhǔn)備好了,下面我們就將handlers綁定到logger上,一個(gè)logger對(duì)象可以綁定多個(gè)handler。

logger.addHandler(logfile)  #logger是通過getLogger得到的Logger對(duì)象

logger.addHandler(console) 

五、使用logger真正寫日志

logger.debug("some debug message.")

logger.info("some info message.")

看上去,中間步驟(創(chuàng)建handler,設(shè)置日志級(jí)別,設(shè)置輸出格式等)更像是配置Logger,一旦配置完成則直接調(diào)用寫日志的接口即可,稍后這些日志將按照先前的配置輸出。

嗚呼,好多內(nèi)容啊,來點(diǎn)簡(jiǎn)單的吧.

下面的代碼,是最簡(jiǎn)單的。導(dǎo)入logging之后就進(jìn)行了寫日志操作:

  1. #coding:utf-8 
  2. import logging 
  3.  
  4. logging.debug("debug mes"
  5.  
  6. logging.info("info mes"
  7.  
  8. logging.warning("warn mes"

控制臺(tái)輸出如下:

WARNING:root:warn mes

咦?發(fā)生了什么情況,為什么只輸出了warning?handler、logger、formatter去哪兒了?

-_-!說好的最簡(jiǎn)單的呢?為了讓自己講信用,我盡可能把它解釋成“最簡(jiǎn)單的”。

#p#

知識(shí)點(diǎn)1:logger間存在繼承關(guān)系

logger 通過名字來決定繼承關(guān)系,如果一個(gè)logger的名字是"mydest",另一個(gè)logger的名字是"mydest.dest1" (getLogger("mydest.dest1")),那么就稱后者是前者的子logger,會(huì)繼承前者的配置。上面的代碼沒有指定logger,直接調(diào)用logging.debug等方法時(shí),會(huì)使用所有l(wèi)ogger的祖先類RootLogger

從上面的代碼運(yùn)行結(jié)果可以猜測(cè)出,該RootLogger設(shè)置的日志級(jí)別是logging.WARN,輸出目的地是標(biāo)準(zhǔn)流。從源碼可以更清楚的看出來:

  1. root = RootLogger(WARNING)  #設(shè)置WARNING的級(jí)別 

至于rootLogger的輸出目的地的配置,我們跟蹤logging.debug的源代碼來看一下:

  1. def debug(msg, *args, **kwargs): 
  2.  
  3. ""
  4.  
  5. Log a message with severity 'DEBUG' on the root logger. 
  6.  
  7. ""
  8.  
  9. if len(root.handlers) == 0
  10.  
  11. basicConfig() 
  12.  
  13. root.debug(msg, *args, **kwargs) 

大約可以看到,如果rootLogger沒有配置handler,就會(huì)不帶參數(shù)運(yùn)行basicConfig函數(shù)(*請(qǐng)看知識(shí)點(diǎn)2),我們看一下basicConfig的源代碼:

  1. def basicConfig(**kwargs): 
  2.  
  3. _acquireLock() 
  4.  
  5. try
  6.  
  7. if len(root.handlers) == 0
  8.  
  9. filename = kwargs.get("filename"
  10.  
  11. if filename: 
  12.  
  13. mode = kwargs.get("filemode"'a'
  14.  
  15. hdlr = FileHandler(filename, mode) 
  16.  
  17. else
  18.  
  19. stream = kwargs.get("stream"
  20.  
  21. hdlr = StreamHandler(stream) 
  22.  
  23. fs = kwargs.get("format", BASIC_FORMAT) 
  24.  
  25. dfs = kwargs.get("datefmt"None
  26.  
  27. fmt = Formatter(fs, dfs) 
  28.  
  29. hdlr.setFormatter(fmt) 
  30.  
  31. root.addHandler(hdlr) 
  32.  
  33. level = kwargs.get("level"
  34.  
  35. if level is not None
  36.  
  37. root.setLevel(level) 
  38.  
  39. finally
  40.  
  41. _releaseLock() 

因 為參數(shù)為空,所以我們就看出了,該rootLoger使用了不帶參數(shù)的StreamHandler,也可以看到諸如format之類的默認(rèn)配置。之后我們 跟蹤StreamHandler(因?yàn)槲覀兿肟吹饺罩据敵瞿康牡氐呐渲茫鴋andler就是控制日志流向的,所以我們要跟蹤它)的源代碼:

 

  1. class StreamHandler(Handler): 
  2.  
  3. ""
  4.  
  5. A handler class which writes logging records, appropriately formatted, 
  6.  
  7. to a stream. Note that this class does not close the stream, as 
  8.  
  9. sys.stdout or sys.stderr may be used. 
  10.  
  11. ""
  12.  
  13. def __init__(self, stream=None): 
  14.  
  15. ""
  16.  
  17. Initialize the handler. 
  18.  
  19. If stream is not specified, sys.stderr is used. 
  20.  
  21. ""
  22.  
  23. Handler.__init__(self) 
  24.  
  25. if stream is None: 
  26.  
  27. stream = sys.stderr  #### 
  28.  
  29. self.stream = stream 

不帶參數(shù)的StreamHandler將會(huì)把日志流定位到sys.stderr流,標(biāo)準(zhǔn)錯(cuò)誤流同樣會(huì)輸出到控制臺(tái)

知識(shí)點(diǎn)2:basicConfig函數(shù)用來配置RootLogger

    basicConfig函數(shù)僅用來配置RootLogger,rootLogger是所有Logger的祖先Logger,所以其他一切Logger會(huì)繼承該Logger的配置。

從上面的basicConfig源碼看,它可以有六個(gè)關(guān)鍵字參數(shù),分別為:

filename:執(zhí)行使用該文件名為rootLogger創(chuàng)建FileHandler,而不是StreamHandler

filemode:指定文件打開方式,默認(rèn)是"a"

stream:指定一個(gè)流來初始化StreamHandler。此參數(shù)不能和filename共存,如果同時(shí)提供了這兩個(gè)參數(shù),則stream參數(shù)被忽略

format:為rootLogger的handler指定輸出格式

datefmt:指定輸出的日期時(shí)間格式

level:設(shè)置rootLogger的日志級(jí)別

使用樣例:

 

  1. logging.basicConfig( 
  2.  
  3.    filename = './log.txt'
  4.  
  5.    filemode = 'a'
  6.  
  7.    #stream = sys.stdout, 
  8.  
  9.    format = '%(levelname)s:%(message)s'
  10.  
  11.    datefmt = '%m/%d/%Y %I:%M:%S'
  12.  
  13.    level = logging.DEBUG 

知識(shí)點(diǎn)3 通過示例詳細(xì)討論Logger配置的繼承關(guān)系

首先準(zhǔn)備下繼承條件:log2繼承自log1,logger的名稱可以隨意,要注意‘.’表示的繼承關(guān)系。

 

  1. #coding:utf-8 
  2. import logging 
  3.  
  4. log1 = logging.getLogger("mydear"
  5.  
  6. log1.setLevel(logging.WARNING) 
  7.  
  8. log1.addHandler(StreamHandler()) 
  9.  
  10. log2 = logging.getLogger("mydear.app"
  11.  
  12. log2.error("display"
  13.  
  14. log2.info("not display"

    level的繼承

原則:子logger寫日志時(shí),優(yōu)先使用本身設(shè)置了的level;如果沒有設(shè)置,則逐層向上級(jí)父logger查詢,直到查詢到為止。最極端的情況是,使用rootLogger的默認(rèn)日志級(jí)別logging.WARNING。

從源代碼中看更為清晰, 感謝python的所見即所得:

  1. def getEffectiveLevel(self): 
  2.  
  3. """ 
  4.  
  5. Get the effective level for this logger. 
  6.  
  7. Loop through this logger and its parents in the logger hierarchy, 
  8.  
  9. looking for a non-zero logging level. Return the first one found. 
  10.  
  11. """ 
  12.  
  13. logger = self 
  14.  
  15. while logger: 
  16.  
  17. if logger.level: 
  18.  
  19. return logger.level 
  20.  
  21. logger = logger.parent 
  22.  
  23. return NOTSET 

handler的繼承

原則:先將日志對(duì)象傳遞給子logger的所有handler處理,處理完畢后,如果該子logger的propagate屬性沒有設(shè)置為0,則將日志對(duì)象向上傳遞給***個(gè)父Logger,該父logger的所有handler處理完畢后,如果它的propagate也沒有設(shè)置為0,則繼續(xù)向上層傳遞,以此類推。最終的狀態(tài),要么遇到一個(gè)Logger,它的propagate屬性設(shè)置為了0;要么一直傳遞直到rootLogger處理完畢。

在上面實(shí)例代碼的基礎(chǔ)上,我們?cè)偬砑右痪浯a,即:

  1. #coding:utf-8 
  2.  
  3. import logging 
  4.  
  5. log1 = logging.getLogger("mydear"
  6.  
  7. log1.setLevel(logging.WARNING) 
  8.  
  9. log1.addHandler(StreamHandler()) 
  10.  
  11. log2 = logging.getLogger("mydear.app"
  12.  
  13. log2.error("display"
  14.  
  15. log2.info("not display"
  16.  
  17. print log2.handlers  #打印log2綁定的handler 

輸出如下:

display
[]

說好的繼承,但是子logger竟然沒有綁定父類的handler,what's wrong?

看到下面調(diào)用handler的源代碼,就真相大白了。可以理解成,這不是真正的(類)繼承,只是"行為上的繼承":

  1. def callHandlers(self, record): 
  2.  
  3. ""
  4.  
  5. Pass a record to all relevant handlers. 
  6. Loop through all handlers for this logger and its parents in the 
  7.  
  8. logger hierarchy. If no handler was found, output a one-off error 
  9.  
  10. message to sys.stderr. Stop searching up the hierarchy whenever a 
  11.  
  12. logger with the "propagate" attribute set to zero is found - that 
  13.  
  14. will be the last logger whose handlers are called. 
  15.  
  16. ""
  17.  
  18. c = self 
  19.  
  20. found = 0 
  21.  
  22. while c: 
  23.  
  24. for hdlr in c.handlers: #首先遍歷子logger的所有handler 
  25.  
  26. found = found + 1 
  27.  
  28. if record.levelno >= hdlr.level: 
  29.  
  30. hdlr.handle(record) 
  31.  
  32. if not c.propagate: #如果logger的propagate屬性設(shè)置為0,停止 
  33.  
  34. c = None#break out  
  35.  
  36. else:   #否則使用直接父logger 
  37.  
  38. c = c.parent 
  39.  
  40. ... 

額,最簡(jiǎn)單的樣例牽引出來這么多后臺(tái)的邏輯,不過我們懂一下也是有好處的。

下面,我們將一些零碎的不是很重要的東西羅列一下,這篇就結(jié)束了。

1.幾種LogLevel是全局變量,以整數(shù)形式表示,也可以但是不推薦自定義日志級(jí)別,如果需要將level設(shè)置為用戶配置,則獲取level和檢查level的一般代碼是:

  1. #假設(shè)loglevel代表用戶設(shè)置的level內(nèi)容 
  2.  
  3. numeric_level = getattr(logging, loglevel.upper(), None) 
  4.  
  5. if not isinstance(numeric_level, int): 
  6.  
  7. raise ValueError('Invalid log level: %s' % loglevel) 
  8.  
  9. logging.basicConfig(level=numeric_level, ...) 

2.format格式,用于創(chuàng)建formatter對(duì)象,或者basicConfig中,就不翻譯了

%(name)s    Name of the logger (logging channel)
    %(levelno)s Numeric logging level for the message (DEBUG, INFO,
    WARNING, ERROR, CRITICAL)
    %(levelname)s   Text logging level for the message ("DEBUG", "INFO",
    "WARNING", "ERROR", "CRITICAL")
    %(pathname)s    Full pathname of the source file where the logging
    call was issued (if available)
    %(filename)s    Filename portion of pathname
    %(module)s  Module (name portion of filename)
    %(lineno)d  Source line number where the logging call was issued
    (if available)
    %(funcName)s    Function name
    %(created)f Time when the LogRecord was created (time.time()
    return value)
    %(asctime)s Textual time when the LogRecord was created
    %(msecs)d   Millisecond portion of the creation time
    %(relativeCreated)d Time in milliseconds when the LogRecord was created,
    relative to the time the logging module was loaded
    (typically at application startup time)
    %(thread)d  Thread ID (if available)
    %(threadName)s  Thread name (if available)
    %(process)d Process ID (if available)
    %(message)s The result of record.getMessage(), computed just as
    the record is emitted

3.寫日志接口

logging.warn("%s am a hero", "I")   #1 %格式以參數(shù)形式提供實(shí)參

    logging.warn("%s am a hero" % ("I",)) #2 直接提供字符串,也可以使用format,template

    logging.warn("%(name)s am a hero", {'name':"I"})  #關(guān)鍵字參數(shù)   

logging.warn("%(name)s am a hero" % {'name':"I"}) #甚至這樣也可以

logging.warn("%(name)s am a hero, %(value)s" % {'name':"I", 'value':'Yes'}) #原來%也能解析關(guān)鍵字參數(shù),不一定非是元組

如果關(guān)鍵字和位置參數(shù)混用呢,%應(yīng)該不會(huì)有什么作為了,***也就能這樣:

logging.warn("%(name)s am a hero, %()s" % {'name':"I" ,'': 'Yes'})#也是字典格式化的原理

4.配置logging:

上 面已經(jīng)講了如果配置handler,綁定到logger。如果需要一個(gè)稍微龐大的日志系統(tǒng),可以想象,我們會(huì)使用好多的 addHandler,SetFormatter之類的,有夠煩了。幸好,logging模塊提供了兩種額外配置方法,不需要寫眾多代碼,直接從配置結(jié)構(gòu) 中獲悉我們的配置意圖

方式一:使用配置文件

 

  1. import logging 
  2.  
  3. import logging.config 
  4.  
  5. logging.config.fileConfig('logging.conf'
  6.  
  7. # create logger 
  8.  
  9. logger = logging.getLogger('simpleExample'
  10.  
  11. # 'application' code 
  12.  
  13. logger.debug('debug message'
  14.  
  15. logger.info('info message'
  16.  
  17. logger.warn('warn message'
  18.  
  19. logger.error('error message'
  20.  
  21. logger.critical('critical message'
  22.  
  23.   
  24.  
  25. #配置文件logging.conf的內(nèi)容 
  26.  
  27. [loggers] 
  28.  
  29. keys=root,simpleExample 
  30.  
  31. [handlers] 
  32.  
  33. keys=consoleHandler 
  34.  
  35. [formatters] 
  36.  
  37. keys=simpleFormatter 
  38.  
  39. [logger_root] 
  40.  
  41. level=DEBUG 
  42.  
  43. handlers=consoleHandler 
  44.  
  45. [logger_simpleExample] 
  46.  
  47. level=DEBUG 
  48.  
  49. handlers=consoleHandler 
  50.  
  51. qualname=simpleExample 
  52.  
  53. propagate=0 
  54.  
  55. [handler_consoleHandler] 
  56.  
  57. class=StreamHandler 
  58.  
  59. level=DEBUG 
  60.  
  61. formatter=simpleFormatter 
  62.  
  63. args=(sys.stdout,) 
  64.  
  65. [formatter_simpleFormatter] 
  66.  
  67. format=%(asctime)s - %(name)s - %(levelname)s - %(message)s 
  68.  
  69. datefmt= 

方式二:使用字典

請(qǐng)參閱python2.7.9 Library文檔,鏈接:

https://docs.python.org/2/library/logging.config.html?highlight=dictconfig#configuration-dictionary-schema

5.眾多的handler滿足不同的輸出需要

StreamHandler,F(xiàn)ileHandler,NullHandler,RotatingFileHandler,TimedRotatingFileHandler,SocketHandler,DatagramHandler,SMTPHandler,SysLogHandler,NTEventLogHandler,MemoryHandler,HTTPHandler,WatchedFileHandler,

其中前三種在logging模塊中給出,其他的在logging.handlers模塊中給出。

 

 

 

責(zé)任編輯:王雪燕 來源: 51CTO博客
相關(guān)推薦

2015-05-15 10:04:28

localhost

2015-03-09 14:53:04

OracleOracle DGDataGuard F

2014-12-01 10:33:51

Python

2011-03-15 13:19:27

iptablesHOWTO

2015-07-01 10:25:07

Docker開源項(xiàng)目容器

2015-06-17 09:34:09

軟件定義存儲(chǔ) 云存儲(chǔ)

2014-12-12 10:46:55

Azure地緣組affinitygro

2015-06-15 13:06:23

項(xiàng)目項(xiàng)目經(jīng)驗(yàn)

2014-10-23 09:47:28

安全運(yùn)維Iperf

2015-04-21 09:28:58

ockerdocker監(jiān)控平臺(tái)監(jiān)控

2015-07-29 13:46:27

OpenStackIcehouse私有云實(shí)戰(zhàn)部署

2022-03-04 09:59:16

logging模塊函數(shù)程序

2015-07-03 11:26:07

MySQL高可用架MHA

2015-03-02 09:22:09

Javascript函數(shù)用法apply

2015-06-17 09:43:45

云計(jì)算應(yīng)用傳統(tǒng)企業(yè)應(yīng)用云平臺(tái)

2015-04-13 11:34:56

Windows DocNano ServerPaaS

2015-04-17 11:17:15

大數(shù)據(jù)大數(shù)據(jù)擇業(yè)

2015-12-10 10:13:22

2014-11-25 11:33:35

2014-12-11 10:31:22

網(wǎng)絡(luò)優(yōu)化KVM
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国产一二三四在线视频| 看欧美日韩国产| 久久无码精品丰满人妻| 动漫av一区| 一本色道久久加勒比精品| 亚洲精品tv久久久久久久久| 国产人妖一区二区| 国产精品亚洲综合久久| 久久久999精品| 中文字幕一区三区久久女搜查官| 成人做爰视频www| 亚洲成人自拍偷拍| 一本一道久久久a久久久精品91| 欧美 日韩 中文字幕| 日韩精品免费视频人成| 久久久久久久影院| 波多野结衣家庭教师在线观看 | 怡红院一区二区| 日韩和的一区二在线| 一区二区三区国产豹纹内裤在线| 欧美日韩精品不卡| 免费观看黄色一级视频| 激情国产一区二区| 国产精品草莓在线免费观看| 国产午夜小视频| 综合激情婷婷| 永久免费毛片在线播放不卡| 欧美肉大捧一进一出免费视频| 亚洲成人高清| 欧美亚洲高清一区| 91av资源网| 福利网站在线观看| 成人免费视频在线观看| 日本婷婷久久久久久久久一区二区 | 7799精品视频| 韩国视频一区二区三区| 成人美女视频| 欧美视频在线免费看| 亚洲熟妇无码av在线播放| 国产网站在线免费观看| 国产欧美一区二区三区在线看蜜臀 | 亚洲一级片免费看| 日韩av一区二| 国产成人精品av在线| 少妇太紧太爽又黄又硬又爽| 亚洲午夜久久久久久尤物| 精品国产一区二区三区久久| 日本欧美一区二区三区不卡视频 | 最新视频 - x88av| 午夜激情视频在线| 国产精品你懂的| 日韩中文字幕av在线| 精品无吗乱吗av国产爱色| 99精品欧美一区| 精品视频第一区| 偷拍自拍在线| 91啪亚洲精品| 日本一区高清在线视频| 成人免费在线电影| 中文字幕欧美日韩一区| 伊人久久青草| 毛片在线播放a| 亚洲免费高清视频在线| 超碰97在线看| 波多野结衣在线高清| 婷婷开心激情综合| 久久久久久香蕉| 欧美大片网站| 日韩午夜电影在线观看| 日本一级大毛片a一| 黑色丝袜福利片av久久| 日韩理论片久久| 亚洲精品视频网址| 亚洲激情中文| 97国产精品免费视频| 99久久久久久久久| 麻豆精品在线观看| av成人观看| 无码国产伦一区二区三区视频 | 日韩电影免费观| 欧美午夜精品理论片a级按摩| 手机看片一级片| japanese色系久久精品| 日韩电影大全免费观看2023年上| 国产aⅴ激情无码久久久无码| 成人影院在线| 欧美大荫蒂xxx| 中文字幕一区在线播放| 久久精品国产**网站演员| 99在线观看视频网站| 天堂中文资源在线| 国产精品免费av| 国产亚洲黄色片| 激情亚洲影院在线观看| 91精品久久久久久蜜臀| 麻豆国产精品一区| 99久久久久| 97视频在线观看成人| 亚洲精品一区二区二区| 成人性生交大片免费| 欧美一区二视频在线免费观看| 老司机在线永久免费观看| 五月综合激情网| 亚洲va综合va国产va中文| 玖玖玖免费嫩草在线影院一区| 在线播放日韩精品| 日本熟妇毛耸耸xxxxxx| 精品一区二区三区在线播放| 国内一区二区三区在线视频| av在线播放av| 欧美午夜xxx| 久久久久亚洲av无码麻豆| 亚洲免费成人av在线| 久久中国妇女中文字幕| 国产精品欧美综合| 91丝袜呻吟高潮美腿白嫩在线观看| 少妇熟女一区二区| 欧美大片免费| 日韩av网址在线观看| 顶臀精品视频www| 日本亚洲三级在线| 久久久www免费人成黑人精品| 日本中文字幕在线2020| 色吊一区二区三区| 三级视频网站在线观看| 欧美激情视频一区二区三区免费| 国产精品伦子伦免费视频| 天天干视频在线| 亚洲已满18点击进入久久| 依人在线免费视频| 欧美日韩国产在线观看网站| 97婷婷涩涩精品一区| 成人av手机在线| 最近日韩中文字幕| 污污的视频免费| 日韩专区精品| 国产精品爽爽ⅴa在线观看| 日本啊v在线| 欧美日韩视频在线| 艳妇乳肉豪妇荡乳xxx| 欧美成人嫩草网站| 亚洲一区免费网站| sm国产在线调教视频| 欧美裸体bbwbbwbbw| avhd101老司机| 日本va欧美va精品| 少妇免费毛片久久久久久久久| 久久毛片亚洲| 亚洲视频在线观看免费| 国产精品高清无码| 日本一区二区免费在线| 另类小说第一页| 日本一本不卡| 91精品久久久久久久久中文字幕| 日本在线观看视频| 欧美精品丝袜中出| 国产黄色片在线免费观看| 国产真实精品久久二三区| 在线成人性视频| 成人国产精品一区二区网站| 久久精品久久精品亚洲人| 国产强被迫伦姧在线观看无码| 亚洲欧美日韩人成在线播放| 亚洲美女精品视频| 在线电影一区| 秋霞毛片久久久久久久久| 四虎4545www国产精品| 色妞在线综合亚洲欧美| 国产伦精品一区二区三区免.费 | 日本免费精品视频| 中文欧美字幕免费| 亚洲精品一二三四| 亚洲国产专区| 日韩美女一区| 玖玖玖视频精品| 78m国产成人精品视频| 国产免费a∨片在线观看不卡| 欧美色综合网站| 国产精品成人免费观看| av电影在线观看一区| 黄色三级视频片| 91高清一区| 麻豆成人小视频| 国产极品久久久久久久久波多结野| 久久视频在线视频| 人人妻人人澡人人爽人人欧美一区 | av在线成人| 97久久精品国产| 成年在线观看免费人视频| 日韩欧美中文一区| 中文字幕精品视频在线观看| 国产精品成人免费| 亚洲男人在线天堂| 国产中文一区二区三区| 国产成人精品视频免费看| 日韩在线视频精品| 久久久久久a亚洲欧洲aⅴ| 久久三级毛片| 91大神在线播放精品| 理论片午午伦夜理片在线播放| 亚洲国产天堂久久综合| 国产美女免费视频| 一本久久a久久精品亚洲| 日韩女优一区二区| 国产欧美日韩视频一区二区| 极品白嫩少妇无套内谢| 日本不卡高清视频| 国产97在线 | 亚洲| 一本一道久久a久久精品蜜桃| 欧美激情一区二区三区在线视频| 国模大尺度视频一区二区| 日本中文字幕久久看| 欧美精品videossex少妇| 尤物九九久久国产精品的特点| 好吊视频一二三区| 欧美丰满高潮xxxx喷水动漫| 无码人妻精品一区二区蜜桃色欲| 夜夜夜精品看看| 国精产品一区一区二区三区mba| 91首页免费视频| 黑人玩弄人妻一区二区三区| 国产麻豆91精品| 日本三级黄色网址| 天堂av在线一区| 欧美乱大交xxxxx潮喷l头像| 91精品秘密在线观看| 亚洲欧美国产一区二区| 国产成人高清| 久久香蕉综合色| 大桥未久女教师av一区二区| 51国偷自产一区二区三区的来源 | 黑人另类精品××××性爽| 日韩在线观看免费全| 国产露出视频在线观看| 亚洲精品自拍视频| 深夜福利在线看| 日韩黄色高清视频| 特黄视频在线观看| 亚洲国产日韩欧美在线图片| 懂色av一区二区三区四区| 日韩欧美色电影| www.久久色| 日韩免费观看高清完整版 | 国产精品亚洲午夜一区二区三区| xxx国产在线观看| 另类小说综合欧美亚洲| 岛国毛片在线播放| 蜜臀久久99精品久久久画质超高清 | 成人免费高清在线观看| 欧美国产在线一区| 国产激情一区二区三区四区| 欧美体内she精高潮| 国产精品亚洲一区二区三区妖精 | 亚洲国产精品一区二区久久| 免费一级全黄少妇性色生活片| 一区二区三区日韩精品| 免费一级片视频| 都市激情亚洲色图| 久久精品视频5| 欧美日韩国产在线观看| 国产麻豆精品一区| 精品国产乱子伦一区| 日本精品一二区| 精品视频偷偷看在线观看| 国产午夜视频在线观看| 日日摸夜夜添一区| 亚洲卡一卡二| 91国产视频在线| av一区在线播放| 成人在线观看视频网站| 国产96在线亚洲| 欧美精品一区二区三区四区五区 | 美女av免费观看| 国产精品久久777777毛茸茸| 成人在线激情网| 国产美女久久久久| 国产精品久久久久久亚洲色| 久久久国际精品| 男女做暖暖视频| 欧美午夜无遮挡| 在线视频 中文字幕| 欧美成人精品高清在线播放| 日本啊v在线| 久久中文字幕在线| 免费看av不卡| 亚洲永久免费观看| 九九亚洲精品| 欧美精品久久96人妻无码| 国产精品久久久久久模特| 爱情岛论坛成人| 播五月开心婷婷综合| 国产日韩精品中文字无码| 亚洲国产中文字幕| 最近国语视频在线观看免费播放| 欧美大片在线观看一区| 国产在线观看高清视频| 欧美精品成人在线| 激情中国色综合| 精品欧美一区二区久久久伦| 日韩毛片视频| 日本a级片免费观看| 国产伦精品一区二区三区在线观看 | 一本色道无码道dvd在线观看| 国产美女在线观看一区| 国产又黄又粗的视频| 婷婷亚洲久悠悠色悠在线播放 | 精品亚洲a∨| 久久精品日韩精品| 国产精品s色| 加勒比av中文字幕| 久久久久久久久久久久久久久99 | 欧美一激情一区二区三区| 户外极限露出调教在线视频| 久久久久久久久爱| 3d动漫一区二区三区在线观看| 久久一区二区精品| 91久久亚洲| 欧美性猛交乱大交| 亚洲天堂精品视频| 成人黄色三级视频| 亚洲免费福利视频| av中文资源在线资源免费观看| 成人春色激情网| 色狮一区二区三区四区视频| 国产精品无码专区av在线播放 | av最新在线观看| 欧美伊人久久久久久久久影院| 色就是色亚洲色图| 88xx成人精品| 另类尿喷潮videofree| 国产一二三区在线播放| 国产一区二区三区四区在线观看| 久久精品三级视频| 在线观看亚洲精品| 麻豆影视在线| 国产成人综合亚洲| 国产免费播放一区二区| 日韩免费毛片视频| 久久精品亚洲国产奇米99| 看片网址国产福利av中文字幕| 亚洲第一精品自拍| av中文字幕在线观看第一页 | 不许穿内裤随时挨c调教h苏绵| 亚洲免费观看高清完整版在线观看熊| 国产精品久久综合青草亚洲AV| 丝袜美腿精品国产二区| 日韩午夜电影免费看| 中文字幕一区二区三区最新| 狠狠色丁香婷综合久久| 手机在线免费看毛片| 日韩欧美综合一区| 国模私拍视频在线播放| 国产精品白丝jk白祙| 夜夜精品视频| 蜜桃av免费看| 欧美日韩国产高清一区二区| 国产一二三区在线观看| 国产精品国产精品| 噜噜噜91成人网| 国产又黄又粗又猛又爽的| 7777精品伊人久久久大香线蕉完整版| 成人video亚洲精品| 国产伦精品一区二区三区免| 亚洲一级在线| 日韩精品电影一区二区三区| 欧美精品一卡二卡| 91丝袜在线| 青青成人在线| 国产在线一区观看| 日韩精品在线免费看| 一区二区三区国产在线观看| 婷婷成人av| 国产天堂视频在线观看| 久久免费视频一区| 国产精品热久久| 欧美激情xxxx| 免费视频一区三区| 不卡的在线视频| 婷婷开心激情综合| 日本在线观看www| 国产一区二区不卡视频在线观看| 日韩黄色免费网站| 内射一区二区三区| 日韩成人av在线| 欧美a视频在线| 全黄性性激高免费视频| 欧美国产精品中文字幕| 丰满人妻一区二区| 国产高清视频一区三区| 欧美日本在线| 欧美波霸videosex极品| 精品国产亚洲在线| 97欧美成人| 欧美精品99久久| 亚洲欧洲综合另类| 色中色在线视频| 国产精品jizz视频| 久久精品久久综合| 国产精品suv一区| 欧美夫妻性生活视频|