日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python中的log模块笔记

發布時間:2024/9/20 python 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python中的log模块笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  • 日志相關概念
  • logging模塊簡介
  • 使用logging提供的模塊級別的函數記錄日志
  • logging模塊日志流處理流程
  • 使用logging四大組件記錄日志
  • 配置logging的幾種方式
  • 向日志輸出中添加上下文信息
  • 參考文檔
  • 一、日志相關概念


    日志是一種可以追蹤某些軟件運行時所發生事件的方法。軟件開發人員可以向他們的代碼中調用日志記錄相關的方法來表明發生了某些事情。一個事件可以用一個可包含可選變量數據的消息來描述。此外,事件也有重要性的概念,這個重要性也可以被稱為嚴重性級別(level)。

    1.日志的作用

    通過log的分析,可以方便用戶了解系統或軟件、應用的運行情況;如果你的應用log足夠豐富,也可以分析以往用戶的操作行為、類型喜好、地域分布或其他更多信息;如果一個應用的log同時也分了多個級別,那么可以很輕易地分析得到該應用的健康狀況,及時發現問題并快速定位、解決問題,補救損失。
    簡單來講就是,我們通過記錄和分析日志可以了解一個系統或軟件程序運行情況是否正常,也可以在應用程序出現故障時快速定位問題。比如,做運維的同學,在接收到報警或各種問題反饋后,進行問題排查時通常都會先去看各種日志,大部分問題都可以在日志中找到答案。再比如,做開發的同學,可以通過IDE控制臺上輸出的各種日志進行程序調試。對于運維老司機或者有經驗的開發人員,可以快速的通過日志定位到問題的根源。可見,日志的重要性不可小覷。日志的作用可以簡單總結為以下3點:

    • 程序調試
    • 了解軟件程序運行情況,是否正常
    • 軟件程序運行故障分析與問題定位

    如果應用的日志信息足夠詳細和豐富,還可以用來做用戶行為分析,如:分析用戶的操作行為、類型洗好、地域分布以及其它更多的信息,由此可以實現改進業務、提高商業利益。

    2.日志的等級

    我們先來思考下下面的兩個問題:

    • 作為開發人員,在開發一個應用程序時需要什么日志信息?在應用程序正式上線后需要什么日志信息?
    • 作為應用運維人員,在部署開發環境時需要什么日志信息?在部署生產環境時需要什么日志信息?

    在軟件開發階段或部署開發環境時,為了盡可能詳細的查看應用程序的運行狀態來保證上線后的穩定性,我們可能需要把該應用程序所有的運行日志全部記錄下來進行分析,這是非常耗費機器性能的。當應用程序正式發布或在生產環境部署應用程序時,我們通常只需要記錄應用程序的異常信息、錯誤信息等,這樣既可以減小服務器的I/O壓力,也可以避免我們在排查故障時被淹沒在日志的海洋里。那么,怎樣才能在不改動應用程序代碼的情況下實現在不同的環境記錄不同詳細程度的日志呢?這就是日志等級的作用了,我們通過配置文件指定我們需要的日志等級就可以了。

    不同的應用程序所定義的日志等級可能會有所差別,分的詳細點的會包含以下幾個等級:

    • DEBUG
    • INFO
    • NOTICE
    • WARNING
    • ERROR
    • CRITICAL
    • ALERT
    • EMERGENCY

    3.日志字段信息與日志格式

    本節開始問題提到過,一條日志信息對應的是一個事件的發生,而一個事件通常需要包括以下幾個內容:

    • 事件發生時間
    • 事件發生位置
    • 事件的嚴重程度--日志級別
    • 事件內容

    上面這些都是一條日志記錄中可能包含的字段信息,當然還可以包括一些其他信息,如進程ID、進程名稱、線程ID、線程名稱等。日志格式就是用來定義一條日志記錄中包含那些字段的,且日志格式通常都是可以自定義的。

    說明:

    輸出一條日志時,日志內容和日志級別是需要開發人員明確指定的。對于而其它字段信息,只需要是否顯示在日志中就可以了。

    4.日志功能的實現

    幾乎所有開發語言都會內置日志相關功能,或者會有比較優秀的第三方庫來提供日志操作功能,比如:log4j,log4php等。它們功能強大、使用簡單。Python自身也提供了一個用于記錄日志的標準庫模塊--logging。

    二、logging模塊簡介


    logging模塊定義的函數和類為應用程序和庫的開發實現了一個靈活的事件日志系統。logging模塊是Python的一個標準庫模塊,由標準庫模塊提供日志記錄API的關鍵好處是所有Python模塊都可以使用這個日志記錄功能。所以,你的應用日志可以將你自己的日志信息與來自第三方模塊的信息整合起來。

    1. logging模塊的日志級別

    logging模塊默認定義了以下幾個日志等級,它允許開發人員自定義其他日志級別,但是這是不被推薦的,尤其是在開發供別人使用的庫時,因為這會導致日志級別的混亂。

    日志等級(level)描述
    DEBUG最詳細的日志信息,典型應用場景是 問題診斷
    INFO信息詳細程度僅次于DEBUG,通常只記錄關鍵節點信息,用于確認一切都是按照我們預期的那樣進行工作
    WARNING當某些不期望的事情發生時記錄的信息(如,磁盤可用空間較低),但是此時應用程序還是正常運行的
    ERROR由于一個更嚴重的問題導致某些功能不能正常運行時記錄的信息
    CRITICAL當發生嚴重錯誤,導致應用程序不能繼續運行時記錄的信息

    開發應用程序或部署開發環境時,可以使用DEBUG或INFO級別的日志獲取盡可能詳細的日志信息來進行開發或部署調試;應用上線或部署生產環境時,應該使用WARNING或ERROR或CRITICAL級別的日志來降低機器的I/O壓力和提高獲取錯誤日志信息的效率。日志級別的指定通常都是在應用程序的配置文件中進行指定的。

    說明:

    • 上面列表中的日志等級是從上到下依次升高的,即:DEBUG < INFO < WARNING < ERROR < CRITICAL,而日志的信息量是依次減少的;
    • 當為某個應用程序指定一個日志級別后,應用程序會記錄所有日志級別大于或等于指定日志級別的日志信息,而不是僅僅記錄指定級別的日志信息,nginx、php等應用程序以及這里要提高的python的logging模塊都是這樣的。同樣,logging模塊也可以指定日志記錄器的日志級別,只有級別大于或等于該指定日志級別的日志記錄才會被輸出,小于該等級的日志記錄將會被丟棄。

    2. logging模塊的使用方式介紹

    logging模塊提供了兩種記錄日志的方式:

    • 第一種方式是使用logging提供的模塊級別的函數
    • 第二種方式是使用Logging日志系統的四大組件

    其實,logging所提供的模塊級別的日志記錄函數也是對logging日志系統相關類的封裝而已。

    logging模塊定義的模塊級別的常用函數
    函數說明
    logging.debug(msg, *args, **kwargs)創建一條嚴重級別為DEBUG的日志記錄
    logging.info(msg, *args, **kwargs)創建一條嚴重級別為INFO的日志記錄
    logging.warning(msg, *args, **kwargs)創建一條嚴重級別為WARNING的日志記錄
    logging.error(msg, *args, **kwargs)創建一條嚴重級別為ERROR的日志記錄
    logging.critical(msg, *args, **kwargs)創建一條嚴重級別為CRITICAL的日志記錄
    logging.log(level, *args, **kwargs)創建一條嚴重級別為level的日志記錄
    logging.basicConfig(**kwargs)對root logger進行一次性配置

    其中logging.basicConfig(**kwargs)函數用于指定“要記錄的日志級別”、“日志格式”、“日志輸出位置”、“日志文件的打開模式”等信息,其他幾個都是用于記錄各個級別日志的函數。

    logging模塊的四大組件
    組件說明
    loggers提供應用程序代碼直接使用的接口
    handlers用于將日志記錄發送到指定的目的位置
    filters提供更細粒度的日志過濾功能,用于決定哪些日志記錄將會被輸出(其它的日志記錄將會被忽略)
    formatters用于控制日志信息的最終輸出格式

    說明: logging模塊提供的模塊級別的那些函數實際上也是通過這幾個組件的相關實現類來記錄日志的,只是在創建這些類的實例時設置了一些默認值。

    三、使用logging提供的模塊級別的函數記錄日志


    回顧下前面提到的幾個重要信息:

    • 可以通過logging模塊定義的模塊級別的方法去完成簡單的日志記錄
    • 只有級別大于或等于日志記錄器指定級別的日志記錄才會被輸出,小于該級別的日志記錄將會被丟棄。

    1.最簡單的日志輸出

    先來試著分別輸出一條不同日志級別的日志記錄:

    import logging

    logging.debug(“This is a debug log.”)
    logging.info(“This is a info log.”)
    logging.warning(“This is a warning log.”)
    logging.error(“This is a error log.”)
    logging.critical(“This is a critical log.”)

    也可以這樣寫:

    logging.log(logging.DEBUG, "This is a debug log.") logging.log(logging.INFO, "This is a info log.") logging.log(logging.WARNING, "This is a warning log.") logging.log(logging.ERROR, "This is a error log.") logging.log(logging.CRITICAL, "This is a critical log.")

    輸出結果:

    WARNING:root:This is a warning log. ERROR:root:This is a error log. CRITICAL:root:This is a critical log.

    2. 那么問題來了

    問題1:為什么前面兩條日志沒有被打印出來?

    這是因為logging模塊提供的日志記錄函數所使用的日志器設置的日志級別是WARNING,因此只有WARNING級別的日志記錄以及大于它的ERROR和CRITICAL級別的日志記錄被輸出了,而小于它的DEBUG和INFO級別的日志記錄被丟棄了。

    問題2:打印出來的日志信息中各字段表示什么意思?為什么會這樣輸出?

    上面輸出結果中每行日志記錄的各個字段含義分別是:

    日志級別:日志器名稱:日志內容

    之所以會這樣輸出,是因為logging模塊提供的日志記錄函數所使用的日志器設置的日志格式默認是BASIC_FORMAT,其值為:

    "%(levelname)s:%(name)s:%(message)s"
    問題3:如果將日志記錄輸出到文件中,而不是打印到控制臺?

    因為在logging模塊提供的日志記錄函數所使用的日志器設置的處理器所指定的日志輸出位置默認為:
    sys.stderr。

    問題4:我是怎么知道這些的?

    查看這些日志記錄函數的實現代碼,可以發現:當我們沒有提供任何配置信息的時候,這些函數都會去調用logging.basicConfig(**kwargs)方法,且不會向該方法傳遞任何參數。繼續查看basicConfig()方法的代碼就可以找到上面這些問題的答案了。

    問題5:怎么修改這些默認設置呢?

    其實很簡單,在我們調用上面這些日志記錄函數之前,手動調用一下basicConfig()方法,把我們想設置的內容以參數的形式傳遞進去就可以了。

    3. logging.basicConfig()函數說明

    該方法用于為logging日志系統做一些基本配置,方法定義如下:

    logging.basicConfig(**kwargs)

    該函數可接收的關鍵字參數如下:

    參數名稱描述
    filename指定日志輸出目標文件的文件名,指定該設置項后日志信心就不會被輸出到控制臺了
    filemode指定日志文件的打開模式,默認為'a'。需要注意的是,該選項要在filename指定時才有效
    format指定日志格式字符串,即指定日志輸出時所包含的字段信息以及它們的順序。logging模塊定義的格式字段下面會列出。
    datefmt指定日期/時間格式。需要注意的是,該選項要在format中包含時間字段%(asctime)s時才有效
    level指定日志器的日志級別
    stream指定日志輸出目標stream,如sys.stdout、sys.stderr以及網絡stream。需要說明的是,stream和filename不能同時提供,否則會引發 ValueError異常
    stylePython 3.2中新添加的配置項。指定format格式字符串的風格,可取值為'%'、'{'和'$',默認為'%'
    handlersPython 3.3中新添加的配置項。該選項如果被指定,它應該是一個創建了多個Handler的可迭代對象,這些handler將會被添加到root logger。需要說明的是:filename、stream和handlers這三個配置項只能有一個存在,不能同時出現2個或3個,否則會引發ValueError異常。

    4. logging模塊定義的格式字符串字段

    我們來列舉一下logging模塊中定義好的可以用于format格式字符串中字段有哪些:

    字段/屬性名稱使用格式描述
    asctime%(asctime)s日志事件發生的時間--人類可讀時間,如:2003-07-08 16:49:45,896
    created%(created)f日志事件發生的時間--時間戳,就是當時調用time.time()函數返回的值
    relativeCreated%(relativeCreated)d日志事件發生的時間相對于logging模塊加載時間的相對毫秒數(目前還不知道干嘛用的)
    msecs%(msecs)d日志事件發生事件的毫秒部分
    levelname%(levelname)s該日志記錄的文字形式的日志級別('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')
    levelno%(levelno)s該日志記錄的數字形式的日志級別(10, 20, 30, 40, 50)
    name%(name)s所使用的日志器名稱,默認是'root',因為默認使用的是 rootLogger
    message%(message)s日志記錄的文本內容,通過 msg % args計算得到的
    pathname%(pathname)s調用日志記錄函數的源碼文件的全路徑
    filename%(filename)spathname的文件名部分,包含文件后綴
    module%(module)sfilename的名稱部分,不包含后綴
    lineno%(lineno)d調用日志記錄函數的源代碼所在的行號
    funcName%(funcName)s調用日志記錄函數的函數名
    process%(process)d進程ID
    processName%(processName)s進程名稱,Python 3.1新增
    thread%(thread)d線程ID
    threadName%(thread)s線程名稱

    5.經過配置的日志輸出

    先簡單配置下日志器的日志級別
    logging.basicConfig(level=logging.DEBUG)

    logging.debug(“This is a debug log.”)
    logging.info(“This is a info log.”)
    logging.warning(“This is a warning log.”)
    logging.error(“This is a error log.”)
    logging.critical(“This is a critical log.”)

    輸出結果:

    DEBUG:root:This is a debug log. INFO:root:This is a info log. WARNING:root:This is a warning log. ERROR:root:This is a error log. CRITICAL:root:This is a critical log.

    所有等級的日志信息都被輸出了,說明配置生效了。

    在配置日志器日志級別的基礎上,在配置下日志輸出目標文件和日志格式
    LOG_FORMAT = "%(asctime)s - %(levelname)s - %(message)s" logging.basicConfig(filename='my.log', level=logging.DEBUG, format=LOG_FORMAT)

    logging.debug(“This is a debug log.”)
    logging.info(“This is a info log.”)
    logging.warning(“This is a warning log.”)
    logging.error(“This is a error log.”)
    logging.critical(“This is a critical log.”)

    此時會發現控制臺中已經沒有輸出日志內容了,但是在python代碼文件的相同目錄下會生成一個名為'my.log'的日志文件,該文件中的內容為:

    2017-05-08 14:29:53,783 - DEBUG - This is a debug log. 2017-05-08 14:29:53,784 - INFO - This is a info log. 2017-05-08 14:29:53,784 - WARNING - This is a warning log. 2017-05-08 14:29:53,784 - ERROR - This is a error log. 2017-05-08 14:29:53,784 - CRITICAL - This is a critical log.
    在上面的基礎上,我們再來設置下日期/時間格式
    LOG_FORMAT = "%(asctime)s - %(levelname)s - %(message)s" DATE_FORMAT = "%m/%d/%Y %H:%M:%S %p"

    logging.basicConfig(filename=‘my.log’, level=logging.DEBUG, format=LOG_FORMAT, datefmt=DATE_FORMAT)

    logging.debug(“This is a debug log.”)
    logging.info(“This is a info log.”)
    logging.warning(“This is a warning log.”)
    logging.error(“This is a error log.”)
    logging.critical(“This is a critical log.”)

    此時會在my.log日志文件中看到如下輸出內容:

    05/08/2017 14:29:04 PM - DEBUG - This is a debug log. 05/08/2017 14:29:04 PM - INFO - This is a info log. 05/08/2017 14:29:04 PM - WARNING - This is a warning log. 05/08/2017 14:29:04 PM - ERROR - This is a error log. 05/08/2017 14:29:04 PM - CRITICAL - This is a critical log.

    掌握了上面的內容之后,已經能夠滿足我們平時開發中需要的日志記錄功能。

    6. 其他說明

    幾個要說明的內容:
    • logging.basicConfig()函數是一個一次性的簡單配置工具使,也就是說只有在第一次調用該函數時會起作用,后續再次調用該函數時完全不會產生任何操作的,多次調用的設置并不是累加操作。
    • 日志器(Logger)是有層級關系的,上面調用的logging模塊級別的函數所使用的日志器是RootLogger類的實例,其名稱為'root',它是處于日志器層級關系最頂層的日志器,且該實例是以單例模式存在的。
    • 如果要記錄的日志中包含變量數據,可使用一個格式字符串作為這個事件的描述消息(logging.debug、logging.info等函數的第一個參數),然后將變量數據作為第二個參數*args的值進行傳遞,如:logging.warning('%s is %d years old.', 'Tom', 10),輸出內容為WARNING:root:Tom is 10 years old.
    • logging.debug(), logging.info()等方法的定義中,除了msg和args參數外,還有一個**kwargs參數。它們支持3個關鍵字參數: exc_info, stack_info, extra,下面對這幾個關鍵字參數作個說明。
    關于exc_info, stack_info, extra關鍵詞參數的說明:
    • exc_info: 其值為布爾值,如果該參數的值設置為True,則會將異常異常信息添加到日志消息中。如果沒有異常信息則添加None到日志信息中。
    • stack_info: 其值也為布爾值,默認值為False。如果該參數的值設置為True,棧信息將會被添加到日志信息中。
    • extra: 這是一個字典(dict)參數,它可以用來自定義消息格式中所包含的字段,但是它的key不能與logging模塊定義的字段沖突。
    一個例子:

    在日志消息中添加exc_info和stack_info信息,并添加兩個自定義的字端 ip和user

    LOG_FORMAT = "%(asctime)s - %(levelname)s - %(user)s[%(ip)s] - %(message)s" DATE_FORMAT = "%m/%d/%Y %H:%M:%S %p"

    logging.basicConfig(format=LOG_FORMAT, datefmt=DATE_FORMAT)
    logging.warning(“Some one delete the log file.”, exc_info=True, stack_info=True, extra={‘user’: ‘Tom’, ‘ip’:‘47.98.53.222’})

    輸出結果:

    05/08/2017 16:35:00 PM - WARNING - Tom[47.98.53.222] - Some one delete the log file. NoneType Stack (most recent call last):File "C:/Users/wader/PycharmProjects/LearnPython/day06/log.py", line 45, in <module>logging.warning("Some one delete the log file.", exc_info=True, stack_info=True, extra={'user': 'Tom', 'ip':'47.98.53.222'})

    四、logging模塊日志流處理流程


    在介紹logging模塊的高級用法之前,很有必要對logging模塊所包含的重要組件以及其工作流程做個全面、簡要的介紹,這有助于我們更好的理解我們所寫的代碼(將會觸發什么樣的操作)。

    1. logging日志模塊四大組件

    在介紹logging模塊的日志流處理流程之前,我們先來介紹下logging模塊的四大組件:

    組件名稱對應類名功能描述
    日志器Logger提供了應用程序可一直使用的接口
    處理器Handler將logger創建的日志記錄發送到合適的目的輸出
    過濾器Filter提供了更細粒度的控制工具來決定輸出哪條日志記錄,丟棄哪條日志記錄
    格式器Formatter決定日志記錄的最終輸出格式

    logging模塊就是通過這些組件來完成日志處理的,上面所使用的logging模塊級別的函數也是通過這些組件對應的類來實現的。

    這些組件之間的關系描述:
    • 日志器(logger)需要通過處理器(handler)將日志信息輸出到目標位置,如:文件、sys.stdout、網絡等;
    • 不同的處理器(handler)可以將日志輸出到不同的位置;
    • 日志器(logger)可以設置多個處理器(handler)將同一條日志記錄輸出到不同的位置;
    • 每個處理器(handler)都可以設置自己的過濾器(filter)實現日志過濾,從而只保留感興趣的日志;
    • 每個處理器(handler)都可以設置自己的格式器(formatter)實現同一條日志以不同的格式輸出到不同的地方。

    簡單點說就是:日志器(logger)是入口,真正干活兒的是處理器(handler),處理器(handler)還可以通過過濾器(filter)和格式器(formatter)對要輸出的日志內容做過濾和格式化等處理操作。

    2. logging日志模塊相關類及其常用方法介紹

    下面介紹下與logging四大組件相關的類:Logger, Handler, Filter, Formatter。

    Logger類

    Logger對象有3個任務要做:

    • 1)向應用程序代碼暴露幾個方法,使應用程序可以在運行時記錄日志消息;
    • 2)基于日志嚴重等級(默認的過濾設施)或filter對象來決定要對哪些日志進行后續處理;
    • 3)將日志消息傳送給所有感興趣的日志handlers。

    Logger對象最常用的方法分為兩類:配置方法 和 消息發送方法

    最常用的配置方法如下:

    方法描述
    Logger.setLevel()設置日志器將會處理的日志消息的最低嚴重級別
    Logger.addHandler() 和 Logger.removeHandler()為該logger對象添加 和 移除一個handler對象
    Logger.addFilter() 和 Logger.removeFilter()為該logger對象添加 和 移除一個filter對象

    關于Logger.setLevel()方法的說明:

    內建等級中,級別最低的是DEBUG,級別最高的是CRITICAL。例如setLevel(logging.INFO),此時函數參數為INFO,那么該logger將只會處理INFO、WARNING、ERROR和CRITICAL級別的日志,而DEBUG級別的消息將會被忽略/丟棄。

    logger對象配置完成后,可以使用下面的方法來創建日志記錄:

    方法描述
    Logger.debug(), Logger.info(), Logger.warning(), Logger.error(), Logger.critical()創建一個與它們的方法名對應等級的日志記錄
    Logger.exception()創建一個類似于Logger.error()的日志消息
    Logger.log()需要獲取一個明確的日志level參數來創建一個日志記錄

    說明:

    • Logger.exception()與Logger.error()的區別在于:Logger.exception()將會輸出堆棧追蹤信息,另外通常只是在一個exception handler中調用該方法。
    • Logger.log()與Logger.debug()、Logger.info()等方法相比,雖然需要多傳一個level參數,顯得不是那么方便,但是當需要記錄自定義level的日志時還是需要該方法來完成。

    那么,怎樣得到一個Logger對象呢?一種方式是通過Logger類的實例化方法創建一個Logger類的實例,但是我們通常都是用第二種方式--logging.getLogger()方法。

    logging.getLogger()方法有一個可選參數name,該參數表示將要返回的日志器的名稱標識,如果不提供該參數,則其值為'root'。若以相同的name參數值多次調用getLogger()方法,將會返回指向同一個logger對象的引用。

    關于logger的層級結構與有效等級的說明:

    • logger的名稱是一個以'.'分割的層級結構,每個'.'后面的logger都是'.'前面的logger的children,例如,有一個名稱為 foo 的logger,其它名稱分別為 foo.bar, foo.bar.baz 和 foo.bam都是 foo 的后代。
    • logger有一個"有效等級(effective level)"的概念。如果一個logger上沒有被明確設置一個level,那么該logger就是使用它parent的level;如果它的parent也沒有明確設置level則繼續向上查找parent的parent的有效level,依次類推,直到找到個一個明確設置了level的祖先為止。需要說明的是,root logger總是會有一個明確的level設置(默認為 WARNING)。當決定是否去處理一個已發生的事件時,logger的有效等級將會被用來決定是否將該事件傳遞給該logger的handlers進行處理。
    • child loggers在完成對日志消息的處理后,默認會將日志消息傳遞給與它們的祖先loggers相關的handlers。因此,我們不必為一個應用程序中所使用的所有loggers定義和配置handlers,只需要為一個頂層的logger配置handlers,然后按照需要創建child loggers就可足夠了。我們也可以通過將一個logger的propagate屬性設置為False來關閉這種傳遞機制。
    Handler類

    Handler對象的作用是(基于日志消息的level)將消息分發到handler指定的位置(文件、網絡、郵件等)。Logger對象可以通過addHandler()方法為自己添加0個或者更多個handler對象。比如,一個應用程序可能想要實現以下幾個日志需求:

    • 1)把所有日志都發送到一個日志文件中;
    • 2)把所有嚴重級別大于等于error的日志發送到stdout(標準輸出);
    • 3)把所有嚴重級別為critical的日志發送到一個email郵件地址。
      這種場景就需要3個不同的handlers,每個handler復雜發送一個特定嚴重級別的日志到一個特定的位置。

    一個handler中只有非常少數的方法是需要應用開發人員去關心的。對于使用內建handler對象的應用開發人員來說,似乎唯一相關的handler方法就是下面這幾個配置方法:

    方法描述
    Handler.setLevel()設置handler將會處理的日志消息的最低嚴重級別
    Handler.setFormatter()為handler設置一個格式器對象
    Handler.addFilter() 和 Handler.removeFilter()為handler添加 和 刪除一個過濾器對象

    需要說明的是,應用程序代碼不應該直接實例化和使用Handler實例。因為Handler是一個基類,它只定義了素有handlers都應該有的接口,同時提供了一些子類可以直接使用或覆蓋的默認行為。下面是一些常用的Handler:

    Handler描述
    logging.StreamHandler將日志消息發送到輸出到Stream,如std.out, std.err或任何file-like對象。
    logging.FileHandler將日志消息發送到磁盤文件,默認情況下文件大小會無限增長
    logging.handlers.RotatingFileHandler將日志消息發送到磁盤文件,并支持日志文件按大小切割
    logging.hanlders.TimedRotatingFileHandler將日志消息發送到磁盤文件,并支持日志文件按時間切割
    logging.handlers.HTTPHandler將日志消息以GET或POST的方式發送給一個HTTP服務器
    logging.handlers.SMTPHandler將日志消息發送給一個指定的email地址
    logging.NullHandler該Handler實例會忽略error messages,通常被想使用logging的library開發者使用來避免'No handlers could be found for logger XXX'信息的出現。
    Formater類

    Formater對象用于配置日志信息的最終順序、結構和內容。與logging.Handler基類不同的是,應用代碼可以直接實例化Formatter類。另外,如果你的應用程序需要一些特殊的處理行為,也可以實現一個Formatter的子類來完成。

    Formatter類的構造方法定義如下:

    logging.Formatter.__init__(fmt=None, datefmt=None, style='%')

    可見,該構造方法接收3個可選參數:

    • fmt:指定消息格式化字符串,如果不指定該參數則默認使用message的原始值
    • datefmt:指定日期格式字符串,如果不指定該參數則默認使用"%Y-%m-%d %H:%M:%S"
    • style:Python 3.2新增的參數,可取值為 '%', '{'和 '$',如果不指定該參數則默認使用'%'
    Filter類

    Filter可以被Handler和Logger用來做比level更細粒度的、更復雜的過濾功能。Filter是一個過濾器基類,它只允許某個logger層級下的日志事件通過過濾。該類定義如下:

    class logging.Filter(name='')filter(record)

    比如,一個filter實例化時傳遞的name參數值為'A.B',那么該filter實例將只允許名稱為類似如下規則的loggers產生的日志記錄通過過濾:'A.B','A.B,C','A.B.C.D','A.B.D',而名稱為'A.BB', 'B.A.B'的loggers產生的日志則會被過濾掉。如果name的值為空字符串,則允許所有的日志事件通過過濾。

    filter方法用于具體控制傳遞的record記錄是否能通過過濾,如果該方法返回值為0表示不能通過過濾,返回值為非0表示可以通過過濾。

    說明:

    • 如果有需要,也可以在filter(record)方法內部改變該record,比如添加、刪除或修改一些屬性。
    • 我們還可以通過filter做一些統計工作,比如可以計算下被一個特殊的logger或handler所處理的record數量等。

    3. logging日志流處理流程

    下面這個圖描述了日志流的處理流程:

    我們來描述下上面這個圖的日志流處理流程:

    • 1)(在用戶代碼中進行)日志記錄函數調用,如:logger.info(...),logger.debug(...)等;
    • 2)判斷要記錄的日志級別是否滿足日志器設置的級別要求(要記錄的日志級別要大于或等于日志器設置的級別才算滿足要求),如果不滿足則該日志記錄會被丟棄并終止后續的操作,如果滿足則繼續下一步操作;
    • 3)根據日志記錄函數調用時摻入的參數,創建一個日志記錄(LogRecord類)對象;
    • 4)判斷日志記錄器上設置的過濾器是否拒絕這條日志記錄,如果日志記錄器上的某個過濾器拒絕,則該日志記錄會被丟棄并終止后續的操作,如果日志記錄器上設置的過濾器不拒絕這條日志記錄或者日志記錄器上沒有設置過濾器則繼續下一步操作--將日志記錄分別交給該日志器上添加的各個處理器;
    • 5)判斷要記錄的日志級別是否滿足處理器設置的級別要求(要記錄的日志級別要大于或等于該處理器設置的日志級別才算滿足要求),如果不滿足記錄將會被該處理器丟棄并終止后續的操作,如果滿足則繼續下一步操作;
    • 6)判斷該處理器上設置的過濾器是否拒絕這條日志記錄,如果該處理器上的某個過濾器拒絕,則該日志記錄會被當前處理器丟棄并終止后續的操作,如果當前處理器上設置的過濾器不拒絕這條日志記錄或當前處理器上沒有設置過濾器測繼續下一步操作;
    • 7)如果能到這一步,說明這條日志記錄經過了層層關卡允許被輸出了,此時當前處理器會根據自身被設置的格式器(如果沒有設置則使用默認格式)將這條日志記錄進行格式化,最后將格式化后的結果輸出到指定位置(文件、網絡、類文件的Stream等);
    • 8)如果日志器被設置了多個處理器的話,上面的第5-8步會執行多次;
    • 9)這里才是完整流程的最后一步:判斷該日志器輸出的日志消息是否需要傳遞給上一級logger(之前提到過,日志器是有層級關系的)的處理器,如果propagate屬性值為1則表示日志消息將會被輸出到處理器指定的位置,同時還會被傳遞給parent日志器的handlers進行處理直到當前日志器的propagate屬性為0停止,如果propagate值為0則表示不向parent日志器的handlers傳遞該消息,到此結束。

    可見,一條日志信息要想被最終輸出需要依次經過以下幾次過濾:

    • 日志器等級過濾;
    • 日志器的過濾器過濾;
    • 日志器的處理器等級過濾;
    • 日志器的處理器的過濾器過濾;

    需要說明的是: 關于上面第9個步驟,如果propagate值為1,那么日志消息會直接傳遞交給上一級logger的handlers進行處理,此時上一級logger的日志等級并不會對該日志消息進行等級過濾。

    五、使用logging四大組件記錄日志


    現在,我們對logging模塊的重要組件及整個日志流處理流程都應該有了一個比較全面的了解,下面我們來看一個例子。

    1. 需求

    現在有以下幾個日志記錄的需求:

    • 1)要求將所有級別的所有日志都寫入磁盤文件中
    • 2)all.log文件中記錄所有的日志信息,日志格式為:日期和時間 - 日志級別 - 日志信息
    • 3)error.log文件中單獨記錄error及以上級別的日志信息,日志格式為:日期和時間 - 日志級別 - 文件名[:行號] - 日志信息
    • 4)要求all.log在每天凌晨進行日志切割

    2. 分析

    • 1)要記錄所有級別的日志,因此日志器的有效level需要設置為最低級別--DEBUG;
    • 2)日志需要被發送到兩個不同的目的地,因此需要為日志器設置兩個handler;另外,兩個目的地都是磁盤文件,因此這兩個handler都是與FileHandler相關的;
    • 3)all.log要求按照時間進行日志切割,因此他需要用logging.handlers.TimedRotatingFileHandler; 而error.log沒有要求日志切割,因此可以使用FileHandler;
    • 4)兩個日志文件的格式不同,因此需要對這兩個handler分別設置格式器;

    3. 代碼實現

    import logging import logging.handlers import datetime

    logger = logging.getLogger(‘mylogger’)
    logger.setLevel(logging.DEBUG)

    rf_handler = logging.handlers.TimedRotatingFileHandler(‘all.log’, when=‘midnight’, interval=1, backupCount=7, atTime=datetime.time(0, 0, 0, 0))
    rf_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))

    f_handler = logging.FileHandler(‘error.log’)
    f_handler.setLevel(logging.ERROR)
    f_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(filename)s[:%(lineno)d] - %(message)s"))

    logger.addHandler(rf_handler)
    logger.addHandler(f_handler)

    logger.debug(‘debug message’)
    logger.info(‘info message’)
    logger.warning(‘warning message’)
    logger.error(‘error message’)
    logger.critical(‘critical message’)

    all.log文件輸出

    2017-05-13 16:12:40,612 - DEBUG - debug message 2017-05-13 16:12:40,612 - INFO - info message 2017-05-13 16:12:40,612 - WARNING - warning message 2017-05-13 16:12:40,612 - ERROR - error message 2017-05-13 16:12:40,613 - CRITICAL - critical message

    error.log文件輸出

    2017-05-13 16:12:40,612 - ERROR - log.py[:81] - error message 2017-05-13 16:12:40,613 - CRITICAL - log.py[:82] - critical message

    六、配置logging的幾種方式


    作為開發者,我們可以通過以下3中方式來配置logging:

    • 1)使用Python代碼顯式的創建loggers, handlers和formatters并分別調用它們的配置函數;
    • 2)創建一個日志配置文件,然后使用fileConfig()函數來讀取該文件的內容;
    • 3)創建一個包含配置信息的dict,然后把它傳遞個dictConfig()函數;

    具體說明請參考另一篇博文《python之配置日志的幾種方式》

    七、向日志輸出中添加上下文信息


    除了傳遞給日志記錄函數的參數外,有時候我們還想在日志輸出中包含一些額外的上下文信息。比如,在一個網絡應用中,可能希望在日志中記錄客戶端的特定信息,如:遠程客戶端的IP地址和用戶名。這里我們來介紹以下幾種實現方式:

    • 通過向日志記錄函數傳遞一個extra參數引入上下文信息
    • 使用LoggerAdapters引入上下文信息
    • 使用Filters引入上下文信息


    Logging中的一些坑

    基本用法
    下面的代碼展示了logging最基本的用法。

    # -*- coding: utf-8 -*-import logging import sys# 獲取logger實例,如果參數為空則返回root logger logger = logging.getLogger("AppName")# 指定logger輸出格式 formatter = logging.Formatter('%(asctime)s %(levelname)-8s: %(message)s')# 文件日志 file_handler = logging.FileHandler("test.log") file_handler.setFormatter(formatter) # 可以通過setFormatter指定輸出格式# 控制臺日志 console_handler = logging.StreamHandler(sys.stdout) console_handler.formatter = formatter # 也可以直接給formatter賦值# 為logger添加的日志處理器 logger.addHandler(file_handler) logger.addHandler(console_handler)# 指定日志的最低輸出級別,默認為WARN級別 logger.setLevel(logging.INFO)# 輸出不同級別的log logger.debug('this is debug info') logger.info('this is information') logger.warn('this is warning message') logger.error('this is error message') logger.fatal('this is fatal message, it is same as logger.critical') logger.critical('this is critical message')# 2016-10-08 21:59:19,493 INFO : this is information # 2016-10-08 21:59:19,493 WARNING : this is warning message # 2016-10-08 21:59:19,493 ERROR : this is error message # 2016-10-08 21:59:19,493 CRITICAL: this is fatal message, it is same as logger.critical # 2016-10-08 21:59:19,493 CRITICAL: this is critical message# 移除一些日志處理器 logger.removeHandler(file_handler)

    除了這些基本用法,還有一些常見的小技巧可以分享一下。

    格式化輸出日志

    # 格式化輸出service_name = "Booking" logger.error('%s service is down!' % service_name) # 使用python自帶的字符串格式化,不推薦 logger.error('%s service is down!', service_name) # 使用logger的格式化,推薦 logger.error('%s service is %s!', service_name, 'down') # 多參數格式化 logger.error('{} service is {}'.format(service_name, 'down')) # 使用format函數,推薦# 2016-10-08 21:59:19,493 ERROR : Booking service is down!

    記錄異常信息
    當你使用logging模塊記錄異常信息時,不需要傳入該異常對象,只要你直接調用logger.error() 或者 logger.exception()就可以將當前異常記錄下來。

    # 記錄異常信息try:1 / 0 except:# 等同于error級別,但是會額外記錄當前拋出的異常堆棧信息logger.exception('this is an exception message')# 2016-10-08 21:59:19,493 ERROR : this is an exception message # Traceback (most recent call last): # File "D:/Git/py_labs/demo/use_logging.py", line 45, in # 1 / 0 # ZeroDivisionError: integer division or modulo by zero

    logging配置要點
    (1)GetLogger()方法

    這是最基本的入口,該方法參數可以為空,默認的logger名稱是root,如果在同一個程序中一直都使用同名的logger,其實會拿到同一個實例,使用這個技巧就可以跨模塊調用同樣的logger來記錄日志。

    另外你也可以通過日志名稱來區分同一程序的不同模塊,比如這個例子。

    logger = logging.getLogger("App.UI") logger = logging.getLogger("App.Service")

    (2)Formatter日志格式

    Formatter對象定義了log信息的結構和內容,構造時需要帶兩個參數:

    一個是格式化的模板fmt,默認會包含最基本的level和 message信息
    一個是格式化的時間樣式datefmt,默認為 2003-07-08 16:49:45,896 (%Y-%m-%d %H:%M:%S)
    fmt中允許使用的變量可以參考下表。

    %(name)s Logger的名字
    %(levelno)s 數字形式的日志級別
    %(levelname)s 文本形式的日志級別
    %(pathname)s 調用日志輸出函數的模塊的完整路徑名,可能沒有
    %(filename)s 調用日志輸出函數的模塊的文件名
    %(module)s 調用日志輸出函數的模塊名|
    %(funcName)s 調用日志輸出函數的函數名|
    %(lineno)d 調用日志輸出函數的語句所在的代碼行
    %(created)f 當前時間,用UNIX標準的表示時間的浮點數表示|
    %(relativeCreated)d 輸出日志信息時的,自Logger創建以來的毫秒數|
    %(asctime)s 字符串形式的當前時間。默認格式是“2003-07-08 16:49:45,896”。逗號后面的是毫秒
    %(thread)d 線程ID。可能沒有
    %(threadName)s 線程名。可能沒有
    %(process)d 進程ID。可能沒有
    %(message)s 用戶輸出的消息

    (3)SetLevel 日志級別
    Logging有如下級別: DEBUG,INFO,WARNING,ERROR,CRITICAL
    默認級別是WARNING,logging模塊只會輸出指定level以上的log。這樣的好處, 就是在項目開發時debug用的log,在產品release階段不用一一注釋,只需要調整logger的級別就可以了,很方便。

    (4)Handler 日志處理器
    最常用的是StreamHandler和FileHandler, Handler用于向不同的輸出端打log。
    Logging包含很多handler, 可能用到的有下面幾種

    StreamHandler instances send error messages to streams (file-like objects).
    FileHandler instances send error messages to disk files.
    RotatingFileHandler instances send error messages to disk files, with support for maximum log file sizes and log file rotation.
    TimedRotatingFileHandler instances send error messages to disk files, rotating the log file at certain timed intervals.
    SocketHandler instances send error messages to TCP/IP sockets.
    DatagramHandler instances send error messages to UDP sockets.
    SMTPHandler instances send error messages to a designated email address.

    (5)Configuration 配置方法

    logging的配置大致有下面幾種方式。

    通過代碼進行完整配置,參考開頭的例子,主要是通過getLogger方法實現。
    通過代碼進行簡單配置,下面有例子,主要是通過basicConfig方法實現。
    通過配置文件,下面有例子,主要是通過 logging.config.fileConfig(filepath)

    logging.basicConfig
    basicConfig()提供了非常便捷的方式讓你配置logging模塊并馬上開始使用,可以參考下面的例子。具體可以配置的項目請查閱官方文檔。

    import logginglogging.basicConfig(filename='example.log',level=logging.DEBUG) logging.debug('This message should go to the log file')logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG) logging.debug('This message should appear on the console')logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p') logging.warning('is when this event was logged.')

    備注: 其實你甚至可以什么都不配置直接使用默認值在控制臺中打log,用這樣的方式替換print語句對日后項目維護會有很大幫助。

    通過文件配置logging
    如果你希望通過配置文件來管理logging,可以參考這個官方文檔。在log4net或者log4j中這是很常見的方式。

    # logging.conf [loggers] keys=root[logger_root] level=DEBUG handlers=consoleHandler #,timedRotateFileHandler,errorTimedRotateFileHandler################################################# [handlers] keys=consoleHandler,timedRotateFileHandler,errorTimedRotateFileHandler[handler_consoleHandler] class=StreamHandler level=DEBUG formatter=simpleFormatter args=(sys.stdout,)[handler_timedRotateFileHandler] class=handlers.TimedRotatingFileHandler level=DEBUG formatter=simpleFormatter args=('debug.log', 'H')[handler_errorTimedRotateFileHandler] class=handlers.TimedRotatingFileHandler level=WARN formatter=simpleFormatter args=('error.log', 'H')################################################# [formatters] keys=simpleFormatter, multiLineFormatter[formatter_simpleFormatter] format= %(levelname)s %(threadName)s %(asctime)s: %(message)s datefmt=%H:%M:%S[formatter_multiLineFormatter] format= ------------------------- %(levelname)s -------------------------Time: %(asctime)sThread: %(threadName)sFile: %(filename)s(line %(lineno)d)Message:%(message)sdatefmt=%Y-%m-%d %H:%M:%S

    假設以上的配置文件放在和模塊相同的目錄,代碼中的調用如下。

    import os filepath = os.path.join(os.path.dirname(__file__), 'logging.conf') logging.config.fileConfig(filepath) return logging.getLogger()

    日志重復輸出的坑
    你有可能會看到你打的日志會重復顯示多次,可能的原因有很多,但總結下來無非就一個,日志中使用了重復的handler。

    第一坑

    import logginglogging.basicConfig(level=logging.DEBUG)fmt = '%(levelname)s:%(message)s' console_handler = logging.StreamHandler() console_handler.setFormatter(logging.Formatter(fmt)) logging.getLogger().addHandler(console_handler)logging.info('hello!')# INFO:root:hello! # INFO:hello!

    上面這個例子出現了重復日志,因為在第3行調用basicConfig()方法時系統會默認創建一個handler,如果你再添加一個控制臺handler時就會出現重復日志。

    第二坑

    import loggingdef get_logger():fmt = '%(levelname)s:%(message)s'console_handler = logging.StreamHandler()console_handler.setFormatter(logging.Formatter(fmt))logger = logging.getLogger('App')logger.setLevel(logging.INFO)logger.addHandler(console_handler)return loggerdef call_me():logger = get_logger()logger.info('hi')call_me() call_me()# INFO:hi # INFO:hi # INFO:hi

    在這個例子里hi居然打印了三次,如果再調用一次call_me()呢?我告訴你會打印6次。why? 因為你每次調用get_logger()方法時都會給它加一個新的handler,你是自作自受。正常的做法應該是全局只配置logger一次。

    第三坑

    import loggingdef get_logger():fmt = '%(levelname)s: %(message)s'console_handler = logging.StreamHandler()console_handler.setFormatter(logging.Formatter(fmt))logger = logging.getLogger('App')logger.setLevel(logging.INFO)logger.addHandler(console_handler)return loggerdef foo():logging.basicConfig(format='[%(name)s]: %(message)s')logging.warn('some module use root logger')def main():logger = get_logger()logger.info('App start.')foo()logger.info('App shutdown.')main()# INFO: App start. # [root]: some module use root logger # INFO: App shutdown. # [App]: App shutdown.

    為嘛最后的App shutdown打印了兩次?所以在Stackoverflow上很多人都問,我應該怎么樣把root logger關掉,root logger太坑爹坑媽了。只要你在程序中使用過root logger,那么默認你打印的所有日志都算它一份。上面的例子沒有什么很好的辦法,我建議你招到那個沒有經過大腦就使用root logger的人,亂棍打死他或者開除他。

    如果你真的想禁用root logger,有兩個不是辦法的辦法:

    logging.getLogger().handlers = [] # 刪除所有的handler logging.getLogger().setLevel(logging.CRITICAL) # 將它的級別設置到最高

    小結
    Python中的日志模塊作為標準庫的一部分,功能還是比較完善的。個人覺得上手簡單,另外也支持比如過濾,文件鎖等高級功能,能滿足大多數項目需求。

    參考:
    https://www.cnblogs.com/yyds/p/6901864.html
    http://python.jobbole.com/86887/

    總結

    以上是生活随笔為你收集整理的python中的log模块笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    av不卡免费看 | 成年免费在线视频 | av成人免费在线 | 欧洲一区二区三区精品 | 免费av的网站 | 97在线观视频免费观看 | 青春草免费在线视频 | 天天操天操| 日韩影片在线观看 | 免费视频在线观看网站 | 中文字幕免费国产精品 | 99久久久久久久久久 | 久久99热精品这里久久精品 | 国产精品美 | 99热都是精品| 国产精品视频资源 | 999久久精品 | 免费亚洲片 | 亚洲性少妇性猛交wwww乱大交 | 特级黄录像视频 | 国产精品久久久久久999 | 精品视频免费 | 久久福利剧场 | 99久久精品网 | 成人毛片在线视频 | 一区二区观看 | 婷婷亚洲综合五月天小说 | 亚洲国产网站 | 一区二区三区四区精品视频 | 亚洲97在线 | 精品久久久成人 | 九九免费在线视频 | 国产精品久久网 | 精品一区二区在线观看 | 99久在线精品99re8热视频 | 欧美日韩精品区 | 青青河边草免费直播 | 久久久视屏 | 久久久久国产精品免费免费搜索 | 97精品在线视频 | 久久er99热精品一区二区三区 | 亚洲精品在线免费播放 | 91在线中字| av丝袜在线 | 精品视频999 | 国产无遮挡又黄又爽在线观看 | 丁香六月欧美 | 97超视频免费观看 | 国产高清免费在线播放 | 中文字幕久久精品 | 国产精品久久久网站 | 日韩天堂网 | 久久无码av一区二区三区电影网 | 手机av资源| 国产精品婷婷午夜在线观看 | 亚洲最新在线视频 | 久久久麻豆视频 | 久久在视频 | 亚洲人成在线观看 | 天堂在线视频中文网 | 久草网免费 | 五月婷婷播播 | 国产尤物在线观看 | 福利区在线观看 | 中文字幕在线看 | 中国一级片在线播放 | 91热视频在线观看 | 日韩在线视频免费看 | 久久国产精品区 | 美女露久久 | 中文字幕字幕中文 | 国产成人精品亚洲a | 黄色片网站av | 2023亚洲精品国偷拍自产在线 | 91精品一 | 不卡的av中文字幕 | 99久久精品国 | 夜夜爽www | 成人在线视频免费观看 | 开心激情婷婷 | 成人动漫一区二区三区 | 中文字幕一区二区三区久久 | 激情久久一区二区三区 | 久久婷婷一区二区三区 | 日韩一区二区三区在线看 | 在线观看亚洲精品视频 | 亚洲精品毛片一级91精品 | 看毛片的网址 | www.久久久精品 | 久久免费精品视频 | 久久五月婷婷综合 | 午夜国产在线观看 | 夜添久久精品亚洲国产精品 | 四虎影视成人永久免费观看视频 | 天天操天天添天天吹 | 国产中文字幕第一页 | 久久99在线视频 | av先锋中文字幕 | 国产一区欧美二区 | 国产精品18毛片一区二区 | 国产高清成人 | av成人免费网站 | 国产探花在线看 | 日本黄色免费在线观看 | 久久久久久久久久久国产精品 | 超碰在线98 | 99精品国自产在线 | 91精彩在线视频 | 国产最新在线观看 | 麻豆免费观看视频 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 丁香六月欧美 | 精品国产一区二区三区四区vr | 中文字幕麻豆 | 夜夜看av | 狠狠色噜噜狠狠狠 | 欧美一区二区三区在线 | 一区二区电影网 | 激情丁香婷婷 | 97色资源| 日韩在线视频一区 | 天天做天天爱天天综合网 | 美女免费av | 久草在线视频网 | 成年人免费电影 | 国内精品久久久久久 | 日韩欧美久久 | 日韩精品最新在线观看 | 亚洲 成人 一区 | 国产手机在线观看视频 | 五月天综合网 | 国产精品久久久久久久电影 | 91理论电影 | 国产午夜三级一区二区三桃花影视 | 亚洲欧美日韩中文在线 | 国产日韩精品一区二区 | 日本最大色倩网站www | 日韩xxx视频| 日韩一级理论片 | www久久99 | 国产中文在线观看 | 国产中文在线字幕 | 久久99精品国产99久久6尤 | 天天干天天操天天入 | 色婷婷久久久 | 91网站在线视频 | 国产色拍拍拍拍在线精品 | 久久精品久久精品久久精品 | 果冻av在线| 婷婷综合导航 | 日韩精品中文字幕在线观看 | 黄色免费网 | 91视频专区 | 久久五月婷婷丁香社区 | 久久激情日本aⅴ | 久久免费视频这里只有精品 | 中文字幕久久亚洲 | 日韩精选在线 | 亚洲国产精品久久久久婷婷884 | 激情婷婷丁香 | 国产精品久久婷婷六月丁香 | 国产精品都在这里 | 天天爱av导航 | 亚洲精品九九 | 婷婷六月丁 | 91精品区 | 欧美福利精品 | 最近日本中文字幕a | 337p日本欧洲亚洲大胆裸体艺术 | 午夜资源站 | 91黄视频在线观看 | 99国产精品视频免费观看一公开 | 国产久草在线观看 | 精品在线你懂的 | 午夜精品久久久久99热app | 国产免费资源 | 91av网站在线观看 | 欧美成人aa | 久操视频在线播放 | 国产麻豆精品久久一二三 | 黄色大片免费播放 | 在线免费视频一区 | 婷婷视频在线 | 国产精品99免视看9 国产精品毛片一区视频 | 久久撸在线视频 | 久草视频在线新免费 | 99视频精品 | 人人爽人人搞 | 91丨九色丨高潮 | 国产成人高清在线 | 中文字幕在线播放日韩 | 久久99深爱久久99精品 | 国产理伦在线 | 三级黄色欧美 | 国产日韩欧美视频 | 在线观看午夜 | 日一日操一操 | www.黄色在线 | 黄www在线观看 | 狠狠狠狠狠狠天天爱 | 久久公开视频 | 成人免费看片98欧美 | 天天综合网~永久入口 | 久久久久国产免费免费 | 亚洲精品视频在线观看网站 | 一区二区三区四区五区在线 | 亚洲人人爱| 日韩天天综合 | 国产手机在线观看视频 | 国产精品18久久久久久久久久久久 | 丁香综合五月 | 久久av高清 | 国内三级在线 | 久草综合在线观看 | 丁香午夜婷婷 | 国产精品成人一区二区三区吃奶 | 在线亚洲日本 | 13日本xxxxxⅹxxx20 | 九九久久久久久久久激情 | 国产精品一区二区三区久久久 | 91九色精品女同系列 | 97视频资源 | 久久国产精品99久久久久 | 欧美成人久久 | av一本久道久久波多野结衣 | 国产成人精品一区二区三区网站观看 | 99久久电影 | 缴情综合网五月天 | 国产网红在线观看 | 精品亚洲一区二区 | 高清精品视频 | 九九热国产视频 | 日韩有码在线观看视频 | www.国产精品 | 久草在线中文888 | 国产成人精品午夜在线播放 | 欧美另类视频 | 欧美极品在线播放 | bbbb操bbbb | 99热超碰| 国产免费嫩草影院 | 天天综合导航 | 欧女人精69xxxxxx | 久久久免费精品 | 久热电影 | 国产一区二区三区高清播放 | 国产精品一区二区久久精品 | 三级黄色大片在线观看 | 日韩免费在线观看视频 | 成人a免费 | 婷婷日日 | 91黄色在线看 | 国产一二区精品 | 久久深夜 | 天天操天天摸天天爽 | 天天草av | 丰满少妇在线观看资源站 | 91tv国产成人福利 | 91成人看片| 久久你懂的 | 最近中文字幕大全中文字幕免费 | 毛片99| 81精品国产乱码久久久久久 | 色欧美成人精品a∨在线观看 | 深爱激情亚洲 | 免费一级特黄毛大片 | 欧美成人h版 | 国产在线观看一 | 国产成人av网 | 欧美日韩国产一区二区三区 | 国产精品粉嫩 | 欧美日韩p片 | www.天天色 | 欧美在线一级片 | 最近中文字幕高清字幕在线视频 | 91成人区 | 国产一级视频 | 超碰97在线资源站 | av成人免费 | 欧美日韩另类在线 | 日本精品一二区 | 日韩r级在线 | 超碰97av在线| av网址在线播放 | 久久五月网 | 在线中文字幕一区二区 | 美女网站视频色 | 亚洲在线视频免费观看 | 日日夜夜精品免费 | 丁香高清视频在线看看 | 韩日视频在线 | 手机在线看片日韩 | 精品日韩av| 成人免费在线网 | 国产视频日韩视频欧美视频 | 一级黄色大片在线观看 | av高清网站在线观看 | 免费在线观看日韩 | 黄色成人av网址 | 日日干日日色 | av官网在线| 国产一级大片免费看 | 久久综合狠狠狠色97 | 香蕉在线观看视频 | 五月天激情在线 | 免费男女羞羞的视频网站中文字幕 | 久久免费看a级毛毛片 | 成人久久久精品国产乱码一区二区 | 免费视频一区 | 国产精品99免费看 | 成人超碰在线 | 米奇狠狠狠888 | 免费观看成年人视频 | 狠狠干婷婷色 | 久久久91精品国产一区二区三区 | 麻豆一精品传二传媒短视频 | 四虎影视成人永久免费观看亚洲欧美 | 久久99亚洲精品久久 | 欧美一区二区伦理片 | 久久国产精品一国产精品 | 国产日韩精品在线 | 亚洲午夜久久久综合37日本 | 三日本三级少妇三级99 | 麻豆视频在线观看免费 | 日韩在线视 | 亚洲激情电影在线 | 国产美女被啪进深处喷白浆视频 | 欧美日韩另类在线 | 色美女在线 | 久久中文字幕在线视频 | 免费欧美高清视频 | 夜色成人网 | 91亚洲精品国偷拍自产在线观看 | 国产一区二区成人 | 中文字幕欲求不满 | 久久精品这里热有精品 | 日韩在线三级 | 99久久精品日本一区二区免费 | 亚洲第一区在线观看 | 婷婷丁香花 | 精品毛片一区二区免费看 | 国产免费叼嘿网站免费 | av在线观| 午夜精品久久久久99热app | 在线a人片免费观看视频 | 国产裸体视频bbbbb | 在线国产精品一区 | 国产精品久久久久婷婷二区次 | 99激情网| 丝袜网站在线观看 | 免费黄a大片 | 欧美a在线免费观看 | 久久九九久久精品 | 黄色一级在线免费观看 | 爱情影院aqdy鲁丝片二区 | 91资源在线视频 | 九九免费精品视频 | 在线免费黄色 | 国产亚洲精品久久 | 免费视频一区 | 天天操天天舔天天爽 | 毛片网站在线看 | 在线电影日韩 | 婷婷在线看 | 九色最新网址 | 日本一区二区三区视频在线播放 | 99久久精品电影 | 97超级碰 | 最近最新中文字幕 | 亚洲精品乱码久久久一二三 | 免费国产一区二区视频 | 九九免费观看全部免费视频 | 视频91| 国产午夜视频在线观看 | 亚洲自拍自偷 | 欧美日韩高清 | 97网| 久久综合婷婷综合 | 超碰个人在线 | 天天干天天草天天爽 | 日韩精品一区二区在线 | 91精品国产一区 | 7799av| 天天操导航 | 高清精品在线 | 国产精品久久久久久久久大全 | 麻豆传媒视频在线免费观看 | 久久久久久久久久久久久影院 | 国产又黄又硬又爽 | 在线视频a| jizz999 | 欧美性大战久久久久 | 黄色av成人在线观看 | 亚洲欧洲一区二区在线观看 | 国语黄色片 | 四虎最新入口 | 久久久久国产成人精品亚洲午夜 | 17婷婷久久www| 久久婷婷久久 | 精品久久久久一区二区国产 | 午夜丰满寂寞少妇精品 | 亚洲精品乱码久久久久久写真 | 免费男女网站 | 国产视频精品在线 | 99热.com | 国产手机av| 黄色成人av | 中文一区在线观看 | 国产精品99久久久久久武松影视 | 成年人免费电影在线观看 | 日韩在线短视频 | 91精品在线麻豆 | 69夜色精品国产69乱 | 人人看人人艹 | 色在线最新 | 91插插插免费视频 | 亚洲网站在线看 | 啪啪免费试看 | 免费进去里的视频 | 欧美一级片免费播放 | 天天干天天操天天入 | 九九九热精品免费视频观看网站 | 在线观看色网 | 日本精品中文字幕在线观看 | 日韩视频在线不卡 | 免费观看完整版无人区 | 69人人| 国产精品久久久久久av | 日韩大片在线观看 | 黄网站免费大全入口 | 美女福利视频一区二区 | 九九九九精品九九九九 | 国产精品一区二区在线观看 | 国产一区二区精 | 日韩免费观看av | 综合网在线视频 | 中文字幕亚洲情99在线 | 91视频免费网站 | 精品a级片 | 精品久久久久国产免费第一页 | 99c视频在线 | 日韩欧美电影 | 97精品一区二区三区 | 我要色综合天天 | 免费精品在线视频 | 99精品视频免费看 | 嫩模bbw搡bbbb搡bbbb | 奇米网444| 久久久精品久久日韩一区综合 | 日日爱网站 | 黄色国产精品 | 久草网免费 | av在线电影免费观看 | 中文字幕免| 91黄色在线看 | 女人久久久久 | 国产美女网 | 日韩久久影院 | 久久精品三 | av中文字幕av | 亚洲男男gaygay无套 | 日韩欧美国产激情在线播放 | 久久精品国产亚洲精品 | 欧美日韩国产在线 | 午夜在线免费观看视频 | 色婷婷久久一区二区 | 一区在线免费观看 | 欧美精品xxx | 亚洲男男gaygay无套 | 91av手机在线 | 久久成人国产精品免费软件 | 国产婷婷vvvv激情久 | 亚洲精品成人免费 | 97色国产 | 欧美一区二区免费在线观看 | 国产不卡av在线 | 午夜在线看片 | 国产精品毛片一区视频播 | 国产一级二级av | www操操| 欧美日韩精品免费观看 | 国产真实在线 | 日本不卡一区二区三区在线观看 | 亚洲电影毛片 | 国产视频一二区 | 久久久久www| 亚洲香蕉在线观看 | 久久综合导航 | 一区二区三区在线电影 | 亚洲黑丝少妇 | 欧美日韩国产二区三区 | 91精品一区二区三区久久久久久 | 免费一级片在线观看 | 亚洲精品国产成人 | 狠狠干天天干 | 激情小说 五月 | 国产精品色 | 婷婷色av | 日韩一级片网址 | 在线看国产一区 | 98超碰在线| 黄a网 | 成年人三级网站 | 96亚洲精品久久 | 欧美在线视频一区二区三区 | 伊人精品在线 | 在线观看激情av | 91日韩精品一区 | 激情丁香5月 | 久久久久亚洲精品男人的天堂 | 日韩视频免费 | 7777xxxx| 成人午夜黄色 | 91精品国产成人www | 亚州精品天堂中文字幕 | www.日日日.com | 日日夜夜天天久久 | 久久久久国产成人精品亚洲午夜 | 欧美日韩视频 | 国产精品免费一区二区三区在线观看 | 免费看黄在线看 | 亚洲久草在线视频 | 综合激情网 | 国产在线观看免费观看 | 亚洲高清视频一区二区三区 | 91私密视频| 成人免费在线视频观看 | 中文字幕一区在线观看视频 | 日韩免费视频一区二区 | www黄色com| 特级大胆西西4444www | 成人羞羞视频在线观看免费 | 国产不卡片 | 午夜 在线 | 国产色婷婷在线 | 中文字幕免费高 | 日韩精品一区二区三区丰满 | 午夜久久久久久久久久久 | 日韩精品91偷拍在线观看 | 97色在线观看免费视频 | 久久久国产精品一区二区三区 | 一区二区三区高清不卡 | 免费看黄网站在线 | 天天操天天拍 | 日韩高清黄色 | 欧美久草网| 色播激情五月 | 成人免费在线观看av | 久久久久久久久久影院 | 一区二区三区免费在线观看视频 | 一区二区三区中文字幕在线 | 97人人添人澡人人爽超碰动图 | 午夜10000| 波多野结衣精品视频 | 久久婷婷精品 | 久久avav| 婷婷电影在线观看 | 在线导航av| 日韩伦理片hd | 日产av在线播放 | 久久久久久久久久久久av | 国产一区二区三区在线免费观看 | 亚洲国产影院 | 九九热.com| 97中文字幕| 国产精品久久99综合免费观看尤物 | 综合伊人av | 欧美analxxxx| 欧美日韩精品在线观看 | 黄色www | 亚洲精品在线免费看 | 午夜精品电影一区二区在线 | 日本一区二区三区免费看 | 91九色porny在线 | 国产精品一区二区三区在线免费观看 | 精品久久久成人 | 丁香婷婷网 | 91污污视频在线观看 | 中文字幕免费不卡视频 | 黄色免费视频在线观看 | 中文字幕色网站 | 丰满少妇麻豆av | 911久久| 亚洲高清视频在线 | 久久精品爱爱视频 | 久久视频这里有精品 | 色综合天天狠天天透天天伊人 | 九月婷婷人人澡人人添人人爽 | 91视频下载| 日本精品视频在线观看 | 在线视频观看亚洲 | 国产又黄又爽无遮挡 | 草久电影 | 国产一区免费观看 | 久久精精品视频 | 国产精品女人网站 | 婷婷中文字幕综合 | 久久久久一区 | 深爱激情五月综合 | 探花视频在线观看 | 国产精品久久久亚洲 | 国产精品久久久久久久午夜 | 色午夜影院 | 婷婷五情天综123 | 玖玖视频网 | 在线免费av网站 | 欧美在线aa | 精品中文字幕视频 | 国产精品久久久久久久久久不蜜月 | 美女视频是黄的免费观看 | 国产亚洲情侣一区二区无 | 一级免费看视频 | 日韩v欧美v日本v亚洲v国产v | 五月婷婷深开心 | 黄在线免费看 | 九9热这里真品2 | 男女男视频 | 欧美一区日韩精品 | 黄色官网在线观看 | 亚洲视频每日更新 | 精品久久影院 | 青青网视频 | 成人黄色毛片视频 | 韩国av一区二区三区在线观看 | 亚洲视频久久久久 | 久久久久久美女 | 91成年人在线观看 | 黄色av播放 | 久久人人爽人人爽人人 | 国产精品精品久久久 | 丝袜美腿亚洲综合 | 国产 在线 日韩 | 色婷婷亚洲婷婷 | 欧美午夜理伦三级在线观看 | 国产99久久九九精品 | 久久伊人八月婷婷综合激情 | 欧美一区二区精品在线 | 免费网站看v片在线a | 狠狠躁夜夜躁人人爽超碰91 | 日韩欧美高清一区二区 | 国产婷婷vvvv激情久 | 亚洲在线网址 | 黄色网www | 97超碰精品| 91日韩精品视频 | 国产午夜精品视频 | 992tv成人免费看片 | 亚洲欧美日韩一区二区三区在线观看 | 色综合久久久久综合体桃花网 | 最新的av网站| 国产在线最新 | 亚洲精品乱码久久久久久蜜桃动漫 | 亚洲精品国产精品国自 | 亚洲资源片 | 免费av在 | 中文字幕二区三区 | 成人免费xxxxxx视频 | 999电影免费在线观看2020 | 欧美日韩中文另类 | 在线午夜 | 亚洲精品乱码久久久久久9色 | 日韩一区二区三免费高清在线观看 | 精品不卡av | 五月av在线 | 国产视频精品视频 | 久久好看免费视频 | 手机色站 | 777奇米四色 | 99精品国产亚洲 | aaa免费毛片 | 国产伦精品一区二区三区在线 | 久久99久久99精品免费看小说 | 综合色站导航 | 国产黄色美女 | 久久精品网站视频 | 天天操天天干天天干 | 久久av免费电影 | 亚洲精品a区 | a级片网站 | 在线观看资源 | 久久国际影院 | 日韩字幕 | 国产亚洲精品福利 | 在线播放精品一区二区三区 | 99精品视频免费看 | 欧美午夜精品久久久久久孕妇 | 在线观看黄网 | 国产在线污 | 日韩理论在线观看 | 久久99精品久久久久久秒播蜜臀 | 成人蜜桃网 | 久久黄色网址 | 国产精品高 | a级国产乱理论片在线观看 伊人宗合网 | 一区三区在线欧 | www.狠狠 | 久久精品视频在线观看免费 | 午夜91视频 | 欧美日韩三区二区 | h视频在线看 | 久久精品视频免费播放 | av免费黄色 | 日日夜操 | 亚洲精品在线观看av | 黄色av成人在线 | 久久久蜜桃一区二区 | 手机av电影在线 | 三级黄色网址 | 国产精品第三页 | 一区二区三区免费在线观看视频 | 久草网视频 | 精品国产伦一区二区三区免费 | 激情综合色图 | 亚洲视频 一区 | 国产精品18久久久久久久久久久久 | 亚洲视频久久 | 国产精品久久久久久久av大片 | 黄色不卡av | 日韩在线视频免费播放 | 亚洲无人区小视频 | x99av成人免费| 中文字幕在线资源 | 久99久中文字幕在线 | 伊人丁香 | 久久中国精品 | 国产视频日韩视频欧美视频 | 91毛片视频 | av在线播放国产 | 久久久噜噜噜久久久 | 美女视频一区二区 | 国产精品中文字幕av | 日本性久久 | 精品国产久| 欧美亚洲三级 | 国产精品久久一区二区无卡 | 久久久www成人免费毛片 | 丁香六月天婷婷 | 亚洲免费在线播放视频 | 天天做夜夜做 | 欧美日本中文字幕 | 97视频在线免费 | 操操日日 | 国产日韩三级 | 国产韩国日本高清视频 | 热久精品 | 777视频在线观看 | 国产综合在线观看视频 | 日韩免费三区 | 国产在线91在线电影 | 免费高清在线观看电视网站 | 91视频国产高清 | 五月天中文字幕 | 99精品国产一区二区三区麻豆 | 成人看片 | 久久久久这里只有精品 | 91污污视频在线观看 | 婷婷精品进入 | 欧美精品久久久久久久久久丰满 | 天天操天天操天天 | 99精品在这里 | 91大神一区二区三区 | 国产中文字幕国产 | 中文字幕国语官网在线视频 | 天天操夜夜操夜夜操 | 国产成人久久 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 狠狠的干狠狠的操 | 亚洲综合色av | 久爱综合 | 日韩精品第1页 | 久久成人免费视频 | 国产v在线播放 | 国产一线二线三线性视频 | 在线黄色国产 | www.超碰 | 97免费在线观看视频 | 日韩欧美在线视频一区二区三区 | 国内外成人在线视频 | 久久视频在线观看 | 国产精品久久久久一区二区国产 | 在线观看91久久久久久 | 天天操天天操天天操天天 | 中文字幕在线影视资源 | 国产一区二区三区高清播放 | 国产成人久久精品一区二区三区 | 日日爽天天 | 日韩av一区二区三区在线观看 | 日韩一区二区免费在线观看 | 日本不卡视频 | 欧美国产日韩一区二区三区 | 国产成人精品综合久久久 | 国产999精品久久久久久麻豆 | 久久成人福利 | 色偷偷男人的天堂av | 日韩中文字幕在线观看 | 91精品视频网站 | 久久人人爽视频 | 激情伊人五月天 | 最近日本中文字幕a | 日韩成人黄色 | 毛片随便看| 啪啪动态视频 | 欧美日韩免费观看一区二区三区 | 91精品国产九九九久久久亚洲 | 婷婷激情综合五月天 | 久久精品一二三区白丝高潮 | 日韩r级电影在线观看 | 99国产一区二区三精品乱码 | 色综合久久中文综合久久牛 | 亚洲五月婷婷 | 国产成人精品一区二区 | 日韩精品欧美视频 | 就要色综合 | 日韩xxxx视频 | 久草视频在线资源站 | 99理论片| 色婷婷综合久久久久 | 又湿又紧又大又爽a视频国产 | 91探花在线 | 欧美日韩二区在线 | 亚洲一区二区视频在线播放 | 美女福利视频一区二区 | 激情欧美丁香 | 在线免费看黄网站 | 日日躁天天躁 | 亚洲黄色免费电影 | 激情综合网色播五月 | 久久99久久精品 | 香蕉影院在线 | 99爱在线 | 夜夜夜夜操| 亚洲手机天堂 | 欧美性天天 | 色久av| 日韩免费一区二区三区 | 国外成人在线视频网站 | 91精品夜夜 | 国产精品免费在线播放 | 在线观看免费成人 | 国产在线国产 | 中国一级片视频 | 婷婷综合影院 | 中文字幕一区二区三区乱码在线 | 国产精品正在播放 | 成人a v视频 | 国产精品观看视频 | 亚洲国产中文字幕在线观看 | 亚洲一区精品二人人爽久久 | 色婷久久| 久草电影在线 | 狠狠色综合网站久久久久久久 | 久久久精品欧美一区二区免费 | 一区二精品 | 成人国产精品久久久久久亚洲 | 日本中文字幕在线播放 | 国产精品久久久久久久久久了 | 精品国产一区二区三区日日嗨 | 九草视频在线 | 亚洲黄色免费网站 | 日韩理论电影在线观看 | 在线观看中文字幕一区二区 | 久久色在线播放 | 91精品在线播放 | 久久成人国产精品免费软件 | 日韩一区二区三区高清在线观看 | 在线国产专区 | www.国产在线观看 | 久久成人午夜 | 精品久久福利 | 日韩一级电影网站 | 日本高清xxxx | 中文字幕亚洲精品在线观看 | 久久久在线观看 | 国产亚洲精品久久久久久电影 | 亚洲国产精品电影在线观看 | 99久久激情 | 在线小视频你懂得 | 国产日本亚洲 | 日韩成人av在线 | 精品久久久久久久久久岛国gif | 久热av | 久久avav| 欧美精品久久天天躁 | 国产视频1 | 一区二区三区三区在线 | 天天天天综合 | 91污视频在线观看 | 久久久久久久免费 | 日韩精品一区二区三区视频播放 | 日本中出在线观看 | www.黄色网.com | 欧美大片在线观看一区 | 国产亚洲精品久久19p | 亚洲激情国产精品 | 中文字幕丰满人伦在线 | 日韩精品一区二区三区三炮视频 | 国产视频亚洲视频 | www.日韩免费 | 又黄又刺激视频 | 丁香色综合| 91丨九色丨蝌蚪丰满 | 青草草在线 | 99视频播放 | 少妇性bbb搡bbb爽爽爽欧美 | 精品主播网红福利资源观看 | 91精品国产91热久久久做人人 | 美女免费视频一区二区 | 国产午夜激情视频 | 国产精品第 | 久久香蕉一区 | 四虎最新域名 | 亚洲一二三久久 | 91黄色在线视频 | 色综合小说 | 五月天久久综合 | 草久在线| 亚洲性少妇性猛交wwww乱大交 | 最近免费中文字幕 | 亚洲精品乱码久久久久久蜜桃动漫 | 中文字幕一区二区三区四区在线视频 | 欧美一级性生活视频 | 中文字幕免费一区二区 | 黄色亚洲精品 | 2019中文字幕第一页 | 久久成人国产精品入口 | 日韩美女高潮 | 国产精品青草综合久久久久99 | 国产精品九九久久99视频 | 欧洲激情综合 | 精品视频免费观看 | 国产99久久精品一区二区300 | 久久亚洲热 | 91av九色| 日韩在线观看三区 | 日本丶国产丶欧美色综合 | 亚洲欧美日韩在线一区二区 | 精品一区二区三区久久久 | 中文字幕在线观看2018 | 免费看国产曰批40分钟 | 国产网站在线免费观看 | 国产精品大全 | 黄色软件在线看 | 久久综合9988久久爱 | 成年人app网址 | 手机在线日韩视频 | www黄色av | 免费观看丰满少妇做爰 | 狠狠网亚洲精品 | 免费看一级特黄a大片 | 毛片随便看 | 国产对白av | 中文字幕不卡在线88 | 日韩av播放在线 | 射射射av | 日韩在线观看一区二区三区 | 久久久在线 | 亚洲va天堂va欧美ⅴa在线 | 久久精品999| 国产美女视频免费 | 天天干天天做 | 婷婷色资源| 六月激情婷婷 | 狠狠狠的干 | 久久视频国产精品免费视频在线 | 人人看人人爱 | 久久久免费精品视频 | 福利二区视频 | 可以免费观看的av片 | 韩国av免费在线 | 国产资源网 | 天天干,狠狠干 | 欧美精品久久久久久久久老牛影院 | 国产成人精品一区在线 | 中文字幕在线观看免费高清完整版 | 亚洲欧美日韩一区二区三区在线观看 | 日韩欧美视频一区 | 亚洲无人区小视频 | 成人在线观看免费视频 | 日韩精品一区二区三区水蜜桃 | 免费观看国产成人 | 免费手机黄色网址 | 日韩免费观看视频 | 91精品国产自产在线观看永久 | 国产在线观看高清视频 | 日本午夜免费福利视频 | 国产精品va最新国产精品视频 | ww视频在线观看 | 免费欧美高清视频 | 青青看片 | 国产五月婷婷 | 国产一区欧美日韩 | 国产精品免费麻豆入口 | 欧美成人999 | 中文字幕一区av | 久青草国产在线 | 免费精品在线 | 国产日韩欧美在线一区 | 偷拍精偷拍精品欧洲亚洲网站 |