亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

Scrapy日志系統(tǒng)生產(chǎn)環(huán)境配置指南:從原理到落地

Scrapy日志系統(tǒng)生產(chǎn)環(huán)境配置指南:從原理到落地 干爬蟲(chóng)這些年我接手過(guò)的項(xiàng)目少說(shuō)也有十幾個(gè)其中九個(gè)的日志系統(tǒng)都是能跑就行的狀態(tài)。直到有一次凌晨?jī)牲c(diǎn)線上爬蟲(chóng)突然停擺解析規(guī)則沒(méi)問(wèn)題、數(shù)據(jù)庫(kù)連接正常、代理池也沒(méi)掛我硬是排查了三個(gè)小時(shí)才找到真兇——日志文件把磁盤(pán)寫(xiě)滿了進(jìn)程直接被系統(tǒng)干掉。從那之后我養(yǎng)成了一個(gè)習(xí)慣接到新項(xiàng)目第一件事就是把Scrapy日志系統(tǒng)和生產(chǎn)環(huán)境配置從頭到尾梳理一遍。這篇博文就把我積累的這些東西完整寫(xiě)出來(lái)包括日志系統(tǒng)的工作原理、settings里的各種開(kāi)關(guān)、擴(kuò)展機(jī)制、生產(chǎn)環(huán)境落地配置還有我踩過(guò)的坑。不管你是剛把本地爬蟲(chóng)腳本改成生產(chǎn)任務(wù)還是被日志問(wèn)題搞得焦頭爛額這篇內(nèi)容應(yīng)該能幫你節(jié)省不少排查時(shí)間。1. 先從一次線上事故說(shuō)起日志系統(tǒng)為什么值得認(rèn)真對(duì)待1.1 那個(gè)把磁盤(pán)寫(xiě)滿的日志文件那次事故的具體情況是這樣的項(xiàng)目大概每天爬取30萬(wàn)條商品數(shù)據(jù)跑了一個(gè)多月沒(méi)出過(guò)問(wèn)題。某個(gè)凌晨我的告警電話響了說(shuō)爬蟲(chóng)進(jìn)程消失了systemd把它標(biāo)記為failed。我登錄服務(wù)器一看磁盤(pán)使用率100%df -h顯示/目錄已經(jīng)被占滿再一看罪魁禍?zhǔn)资莑ogs/scrapy.log大小已經(jīng)是18GB了。為什么會(huì)這樣因?yàn)楫?dāng)時(shí)圖省事直接在settings.py里配置了LOG_FILE logs/scrapy.log這是Scrapy官方提供的最簡(jiǎn)單的文件日志方案。但這個(gè)方案的本質(zhì)就是用一個(gè)FileHandler往同一個(gè)文件里追加寫(xiě)入既不切割、不壓縮、也不清理舊文件。一個(gè)每天寫(xiě)入幾百M(fèi)B的爬蟲(chóng)項(xiàng)目跑一個(gè)月就是這個(gè)結(jié)果。這里需要特別說(shuō)明一個(gè)新手容易忽略的點(diǎn)Scrapy默認(rèn)是只在控制臺(tái)輸出日志的你配置了LOG_FILE之后控制臺(tái)就沒(méi)了全部寫(xiě)進(jìn)文件。但Scrapy不會(huì)幫你做任何輪轉(zhuǎn)log rotation。這不是Scrapy的疏漏因?yàn)槿罩据嗈D(zhuǎn)這件事本身就是部署層該負(fù)責(zé)的但在實(shí)際項(xiàng)目中大多數(shù)人不會(huì)單獨(dú)給爬蟲(chóng)配一個(gè)logrotate任務(wù)于是日志就成了定時(shí)炸彈。后面第4章我會(huì)給出完整的解決方案。1.2 Scrapy日志系統(tǒng)的基本工作原理要避開(kāi)這些坑先得搞清楚Scrapy日志系統(tǒng)到底是怎么運(yùn)轉(zhuǎn)的。簡(jiǎn)單說(shuō)Scrapy的日志建立在Python標(biāo)準(zhǔn)庫(kù)logging之上沒(méi)有自己另搞一套。它內(nèi)部維護(hù)了一組以scrapy開(kāi)頭的logger實(shí)例比如scrapy.core.engine、scrapy.core.scraper、scrapy.core.downloader、scrapy.middleware、scrapy.extensions.logstats等等。爬蟲(chóng)在運(yùn)行過(guò)程中引擎、下載器、中間件、擴(kuò)展這些組件都會(huì)往對(duì)應(yīng)的logger里寫(xiě)日志事件。這些日志事件本身只是一條條帶級(jí)別和上下文的消息真正決定它們?nèi)ツ睦锏氖莚oot logger上的handler。Scrapy啟動(dòng)時(shí)會(huì)調(diào)用configure_logging()做一次統(tǒng)一配置如果你設(shè)置了LOG_FILE就往root logger加一個(gè)FileHandler如果沒(méi)有就加一個(gè)StreamHandler輸出到控制臺(tái)。第三方庫(kù)比如requests、selenium、playwright打出來(lái)的日志只要是通過(guò)標(biāo)準(zhǔn)logging產(chǎn)生的也會(huì)被root logger一起捕獲。很多人在這個(gè)環(huán)節(jié)困惑的點(diǎn)是為什么我設(shè)置了LOG_FILE之后控制臺(tái)什么都沒(méi)有了因?yàn)槟J(rèn)的配置邏輯就是文件或控制臺(tái)二選一——設(shè)置了LOG_FILE就只寫(xiě)文件。要讓兩者同時(shí)輸出就得自己配多個(gè)handler。這一點(diǎn)我在第4章的統(tǒng)一方案里會(huì)解決。理解了日志的三個(gè)關(guān)鍵角色logger誰(shuí)產(chǎn)生消息、handler消息去哪里、formatter消息長(zhǎng)什么樣子后面所有配置你都能自己推出來(lái)。Scrapy給的settings項(xiàng)本質(zhì)上都是對(duì)這些角色的操作LOG_LEVEL控制logger的過(guò)濾級(jí)別LOG_FILE決定handler是文件還是屏幕LOG_FORMAT和LOG_DATEFORMAT控制formatter的模板。搞懂這層對(duì)應(yīng)關(guān)系你就不會(huì)被各種配置項(xiàng)繞暈了。2. settings.py 里的日志開(kāi)關(guān)最常用的配置方式2.1 核心配置項(xiàng)逐一拆解Scrapy的日志配置絕大部分都在settings.py里完成下面這幾個(gè)是必須掌握的。LOG_ENABLED默認(rèn)True。這個(gè)開(kāi)關(guān)控制是否啟用日志系統(tǒng)我建議永遠(yuǎn)別關(guān)。有些人為了讓爬蟲(chóng)跑得快一點(diǎn)會(huì)把它關(guān)掉一旦出問(wèn)題連排查依據(jù)都沒(méi)有得不償失。LOG_LEVEL默認(rèn)DEBUG。在生產(chǎn)環(huán)境我強(qiáng)烈建議改成INFO。別小看這個(gè)改動(dòng)DEBUG級(jí)別的日志量通常是INFO的好幾倍具體來(lái)說(shuō)scrapy.core.engine在DEBUG級(jí)別下幾乎每個(gè)請(qǐng)求的進(jìn)出都會(huì)打兩條日志高并發(fā)爬蟲(chóng)一天能多寫(xiě)幾個(gè)GB。LOG_FILE默認(rèn)None。不設(shè)置就是輸出到控制臺(tái)設(shè)置了就寫(xiě)入文件。注意一點(diǎn)這個(gè)配置本身不做切割和LOG_LEVEL配合使用進(jìn)生產(chǎn)環(huán)境前一定要先解決輪轉(zhuǎn)問(wèn)題。LOG_FILE_MODE默認(rèn)wb。這個(gè)很多人沒(méi)注意到它控制文件的寫(xiě)入模式wb會(huì)覆蓋舊文件。也就是說(shuō)每次啟動(dòng)爬蟲(chóng)同名日志文件會(huì)被清空重寫(xiě)。如果你想保留歷史日志需要改成ab追加模式。但更推薦的做法還是用第4章的滾動(dòng)handler。LOG_FORMAT默認(rèn)字符串是%(asctime)s [%(name)s] %(levelname)s: %(message)s。這里可用的是Python logging標(biāo)準(zhǔn)字段比如%(filename)s、%(lineno)d需要時(shí)自己拼。LOG_DATEFORMAT默認(rèn)%Y-%m-%d %H:%M:%S。按自己喜好調(diào)整我習(xí)慣加上毫秒%Y-%m-%d %H:%M:%S,%f排查對(duì)比兩個(gè)事件的先后順序時(shí)很有用。LOG_SHORT_NAMES默認(rèn)False。如果設(shè)為T(mén)rue日志里的[scrapy.core.engine]會(huì)被簡(jiǎn)寫(xiě)成[engine]。我建議保持False生產(chǎn)環(huán)境日志就是要信息全多幾個(gè)字符不算什么。LOG_STDOUT默認(rèn)False。如果設(shè)為T(mén)ruePython的print輸出也會(huì)被重定向到日志系統(tǒng)里。這個(gè)選項(xiàng)適合那種代碼里殘留了很多print的老項(xiàng)目臨時(shí)救急很好用但新代碼還是老老實(shí)實(shí)用logger。下面用一個(gè)表格把這些匯總配置項(xiàng)默認(rèn)值生產(chǎn)環(huán)境建議說(shuō)明LOG_ENABLEDTrueTrue總開(kāi)關(guān)LOG_LEVELDEBUGINFO控制日志量LOG_FILENone配合輪轉(zhuǎn)使用文件輸出LOG_FILE_MODEwbab覆蓋或追加LOG_FORMAT標(biāo)準(zhǔn)模板建議加時(shí)間毫秒日志格式LOG_DATEFORMAT日期默認(rèn)建議加毫秒時(shí)間格式LOG_SHORT_NAMESFalseFalse保留完整logger名LOG_STDOUTFalse看需求print重定向2.2 命令行和代碼里的覆蓋配置配置日志不一定非要寫(xiě)在settings.py里Scrapy支持多種覆蓋方式優(yōu)先級(jí)是命令行參數(shù) settings.py 代碼默認(rèn)值。命令行方面scrapy crawl myspider -L WARNING可以直接覆蓋日志級(jí)別scrapy crawl myspider -s LOG_FILExxx.log可以動(dòng)態(tài)指定日志文件。這個(gè)主要用于臨時(shí)排查問(wèn)題比如線上日志量太大不想全量記錄可以先用-L WARNING看一下有沒(méi)有錯(cuò)誤堆棧。代碼層面如果要在一個(gè)腳本里用CrawlerProcess跑多個(gè)爬蟲(chóng)并分別控制日志可以通過(guò)get_project_settings()拿到settings對(duì)象后修改它的值再傳給CrawlerProcess。注意修改必須發(fā)生在CrawlerProcess實(shí)例化之前。如果是用CrawlerRunner在Twisted reactor里跑多個(gè)爬蟲(chóng)同理必須在create_crawler之前改。我見(jiàn)過(guò)一些項(xiàng)目會(huì)在一個(gè)進(jìn)程里連續(xù)跑多個(gè)爬蟲(chóng)然后發(fā)現(xiàn)第二個(gè)爬蟲(chóng)的日志級(jí)別不對(duì)就是因?yàn)閟ettings對(duì)象在第一個(gè)爬蟲(chóng)啟動(dòng)時(shí)被改了沒(méi)有給第二個(gè)爬蟲(chóng)恢復(fù)。這種場(chǎng)景建議不要再改全局settings而是每個(gè)爬蟲(chóng)在自己的custom_settings里定義日志配置Scrapy會(huì)在創(chuàng)建該爬蟲(chóng)實(shí)例時(shí)合并這些配置。2.3 日志級(jí)別選擇的實(shí)戰(zhàn)建議一條經(jīng)驗(yàn)法則開(kāi)發(fā)用DEBUG預(yù)發(fā)布用INFO核心鏈路用WARNING兜底。生產(chǎn)環(huán)境全量開(kāi)DEBUG通常是不必要的。我們算一筆賬假設(shè)一個(gè)爬蟲(chóng)每秒處理50個(gè)請(qǐng)求DEBUG級(jí)別下引擎日志和下載器日志加起來(lái)每個(gè)請(qǐng)求大概3~4條每秒就是200條日志。如果每條平均100字節(jié)一天就是1.7GB。而INFO級(jí)別下同樣的爬蟲(chóng)一天的日志量通常在200MB以內(nèi)。差距是數(shù)量級(jí)的。但也不能只看數(shù)量。生產(chǎn)環(huán)境如果完全不開(kāi)INFO很多關(guān)鍵信息會(huì)丟失。比如spider_opened和spider_closed是INFO級(jí)別item_scraped如果是通過(guò)LogStats輸出的也是INFO級(jí)別這些是你判斷爬蟲(chóng)是否健康的核心依據(jù)。所以我的建議是生產(chǎn)環(huán)境默認(rèn)INFO頻繁出錯(cuò)的環(huán)節(jié)單獨(dú)用logger.warning或logger.error輸出既控制量又不丟關(guān)鍵信息。3. 理解Scrapy的擴(kuò)展機(jī)制日志系統(tǒng)背后的推手3.1 Scrapy擴(kuò)展是什么為什么日志要依賴(lài)擴(kuò)展很多人在熱詞里搜scrapy中extensions是什么其實(shí)就是沒(méi)搞懂Scrapy里那套插件機(jī)制。Scrapy擴(kuò)展Extension本質(zhì)上是普通的Python類(lèi)通過(guò)from_crawler類(lèi)方法獲得crawler實(shí)例然后借助crawler.signals.connect訂閱爬蟲(chóng)生命周期中的各種信號(hào)比如spider_opened、spider_closed、item_scraped、response_received等在這些事件發(fā)生時(shí)執(zhí)行自己的邏輯。日志和統(tǒng)計(jì)數(shù)據(jù)強(qiáng)相關(guān)而Scrapy的統(tǒng)計(jì)數(shù)據(jù)Stats Collector本身就是一個(gè)跨組件的狀態(tài)容器所以日志功能天然適合用擴(kuò)展來(lái)實(shí)現(xiàn)。最典型的例子是Scrapy內(nèi)置的LogStats擴(kuò)展它會(huì)在爬蟲(chóng)運(yùn)行期間每隔一段時(shí)間輸出一條類(lèi)似這樣的日志2024-06-18 10:30:00 [scrapy.extensions.logstats] INFO: Crawled 1200 pages (at 4 pages/min), scraped 850 items (at 3 items/min)這條日志不是引擎自動(dòng)打的就是LogStats這個(gè)擴(kuò)展在收到定時(shí)信號(hào)后從Stats Collector里取出數(shù)據(jù)通過(guò)logger輸出的一條INFO消息。理解這一點(diǎn)你在解決日志不輸出的問(wèn)題時(shí)就會(huì)多一個(gè)排查方向是不是自定義擴(kuò)展或默認(rèn)擴(kuò)展被禁用了Scrapy里有EXTENSIONS_BASE這個(gè)默認(rèn)擴(kuò)展集合里面包含了LogStats、CoreStats、Debugger等。你自己添加擴(kuò)展可以通過(guò)EXTENSIONS配置項(xiàng)而禁用默認(rèn)擴(kuò)展也可以在這個(gè)配置里顯式設(shè)為None。3.2 手寫(xiě)一個(gè)日志統(tǒng)計(jì)擴(kuò)展按站點(diǎn)和狀態(tài)碼輸出理解了機(jī)制我們就直接實(shí)操。下面這個(gè)擴(kuò)展解決的問(wèn)題很典型大型爬蟲(chóng)往往要跑多個(gè)站點(diǎn)你會(huì)非常需要知道每個(gè)站點(diǎn)的響應(yīng)狀態(tài)碼分布、Item產(chǎn)出速率。Scrapy標(biāo)準(zhǔn)LogStats只給總量不給細(xì)分維度所以我們自己寫(xiě)一個(gè)擴(kuò)展。import logging from collections import Counter, defaultdict from scrapy import signals logger logging.getLogger(crawler.site_health) class SiteStatsLogExtension: def __init__(self, crawler, log_every500): self.crawler crawler self.stats crawler.stats self.log_every log_every self.response_counter Counter() self.item_counter defaultdict(int) self.total_count 0 classmethod def from_crawler(cls, crawler): ext cls(crawler, crawler.settings.getint(SITE_STATS_LOG_EVERY, 500)) crawler.signals.connect(ext.spider_opened, signals.spider_opened) crawler.signals.connect(ext.response_received, signals.response_received) crawler.signals.connect(ext.item_scraped, signals.item_scraped) crawler.signals.connect(ext.spider_closed, signals.spider_closed) return ext def spider_opened(self, spider): logger.info(site stats module started, log every %d events, self.log_every) def response_received(self, response, **kwargs): site getattr(response, site_name, None) or response.url.split(/)[2] self.response_counter[(site, response.status)] 1 self.total_count 1 if self.total_count % self.log_every 0: self._emit_current_stats(spider_hint) def item_scraped(self, item, spider, **kwargs): site getattr(spider, site_name, None) or spider.name self.item_counter[site] 1 def _emit_current_stats(self, spider_hint): resp_summary { f{site}:{status}: cnt for (site, status), cnt in self.response_counter.items() } item_summary dict(self.item_counter) logger.info( site health snapshot responses%s items%s, resp_summary, item_summary, ) def spider_closed(self, spider, reason): self._emit_current_stats(spider_hintspider.name) logger.info(site stats module closed, total events %d, self.total_count)然后在settings.py里注冊(cè)這個(gè)擴(kuò)展EXTENSIONS { myproject.extensions.SiteStatsLogExtension: 500, }數(shù)字500表示優(yōu)先級(jí)數(shù)字越小越早執(zhí)行。這樣在爬蟲(chóng)跑起來(lái)后每處理500個(gè)響應(yīng)就會(huì)輸出一條包含狀態(tài)碼分布和item數(shù)量的JSON風(fēng)格日志配合第4章的結(jié)構(gòu)化輸出可以直接拿去喂給日志平臺(tái)做告警。注意事項(xiàng)有兩個(gè)。第一response_received信號(hào)攜帶的response在中間件里不一定有site_name屬性所以我在代碼里做了兜底——取URL的域名。這在實(shí)際運(yùn)行中很關(guān)鍵不然擴(kuò)展剛上線就會(huì)因?yàn)锳ttributeError導(dǎo)致整個(gè)爬蟲(chóng)掛掉。第二擴(kuò)展里的異常處理不能省略如果_emit_current_stats內(nèi)部出問(wèn)題也不能讓它影響主流程可以在方法體外面套一層try/except生產(chǎn)環(huán)境的擴(kuò)展代碼必須默認(rèn)日志系統(tǒng)不能拖垮爬蟲(chóng)主線。4. 生產(chǎn)環(huán)境日志配置結(jié)構(gòu)化、滾動(dòng)與集中采集4.1 文件無(wú)限增長(zhǎng)的坑滾動(dòng)策略與handler替換回到第一章那個(gè)事故上根治辦法就是給日志加滾動(dòng)。但Scrapy的LOG_FILE配置項(xiàng)只創(chuàng)建FileHandler并不提供滾動(dòng)能力所以需要自定義handler。這里有一個(gè)關(guān)鍵的實(shí)現(xiàn)前提Scrapy的configure_logging()會(huì)在crawler創(chuàng)建時(shí)運(yùn)行如果你只是在settings.py頂層直接往root logger加handler很可能被它清掉。我踩過(guò)這個(gè)坑最后采用的穩(wěn)妥方案是寫(xiě)一個(gè)擴(kuò)展監(jiān)聽(tīng)engine_started信號(hào)在日志系統(tǒng)初始化完成后替換root logger的handlers。import logging import os from logging.handlers import TimedRotatingFileHandler from scrapy import signals class LogRotationExtension: def __init__(self, log_dir, backup_days): self.log_dir log_dir self.backup_days backup_days classmethod def from_crawler(cls, crawler): ext cls( log_dircrawler.settings.get(LOG_DIR, logs), backup_dayscrawler.settings.getint(LOG_BACKUP_DAYS, 7), ) crawler.signals.connect(ext.engine_started, signals.engine_started) return ext def engine_started(self): root logging.getLogger() # 移除Scrapy默認(rèn)添加的handler避免重復(fù)輸出 for handler in root.handlers[:]: root.removeHandler(handler) os.makedirs(self.log_dir, exist_okTrue) formatter logging.Formatter( %(asctime)s [%(name)s] %(levelname)s: %(message)s, datefmt%Y-%m-%d %H:%M:%S,%f, ) file_handler TimedRotatingFileHandler( os.path.join(self.log_dir, scrapy.log), whenmidnight, backupCountself.backup_days, encodingutf-8, ) file_handler.setFormatter(formatter) root.addHandler(file_handler) console_handler logging.StreamHandler() console_handler.setFormatter(formatter) root.addHandler(console_handler)TimedRotatingFileHandler的whenmidnight表示每天零點(diǎn)切割backupCount7保留最近7個(gè)日志文件自動(dòng)刪除更早的。如果一臺(tái)機(jī)器上日志寫(xiě)入量很大也可以改用RotatingFileHandler按文件大小切割比如單文件超過(guò)500MB切一個(gè)。這兩種方案都能解決磁盤(pán)被寫(xiě)滿的問(wèn)題。替換handler時(shí)注意root.handlers[:]的切片復(fù)制是為了邊遍歷邊刪除直接遍歷原列表會(huì)出問(wèn)題。另外因?yàn)閿U(kuò)展的from_crawler在日志配置之后執(zhí)行engine_started在爬蟲(chóng)引擎啟動(dòng)時(shí)才觸發(fā)所以這個(gè)替換是安全的不會(huì)與Scrapy默認(rèn)handler的初始化邏輯產(chǎn)生競(jìng)態(tài)沖突。4.2 結(jié)構(gòu)化日志輸出讓每一條日志都能被程序解析生產(chǎn)環(huán)境的日志不應(yīng)該只是給人看的還要能被采集、檢索、統(tǒng)計(jì)。最強(qiáng)的做法是把日志輸出成JSON格式。這樣后續(xù)接入ELK或Loki時(shí)不需要寫(xiě)一堆grok解析規(guī)則直接按字段查就行。實(shí)現(xiàn)方式是用自定義Formatter。下面是我項(xiàng)目里在用的一個(gè)輕量實(shí)現(xiàn)不依賴(lài)第三方庫(kù)import json import logging class JsonFormatter(logging.Formatter): def format(self, record): data { timestamp: self.formatTime(record, self.datefmt), logger: record.name, level: record.levelname, message: record.getMessage(), } if record.exc_info: data[exc_info] self.formatException(record.exc_info) return json.dumps(data, ensure_asciiFalse)然后在上一節(jié)的擴(kuò)展里把file_handler.setFormatter(JsonFormatter())替換掉普通Formatter??刂婆_(tái)仍然可以用人類(lèi)可讀的Formatter文件用JSON這樣兼顧排查和機(jī)器采集。這里有一個(gè)細(xì)節(jié)message里如果包含對(duì)象json.dumps會(huì)被類(lèi)型卡住。我在生產(chǎn)里只允許字符串、數(shù)字、字典和列表有一個(gè)簡(jiǎn)單的兜底辦法對(duì)message做str()強(qiáng)制轉(zhuǎn)換但這樣嵌套結(jié)構(gòu)就不好看了。更干凈的做法是在寫(xiě)入日志時(shí)統(tǒng)一用logger.info(xxx, extra{payload: {...}})然后在Formatter里拼裝??傊罩酒脚_(tái)字段越多后續(xù)監(jiān)控告警越靈活。ensure_asciiFalse必須加上不然中文全變成\u轉(zhuǎn)義序列看起來(lái)非常痛苦。這是一行必須記住的代碼。4.3 敏感信息脫敏與記錄邊界爬蟲(chóng)日志經(jīng)常會(huì)把URL、Cookie、Token、請(qǐng)求參數(shù)一起打出來(lái)這在本地沒(méi)問(wèn)題但生產(chǎn)環(huán)境的日志往往會(huì)被采集到統(tǒng)一的日志平臺(tái)這就有信息泄露風(fēng)險(xiǎn)。我在日志系統(tǒng)中做了兩層防護(hù)。第一層在可能涉及敏感信息的日志位置不打印完整內(nèi)容。比如請(qǐng)求頭里的Cookie就用logger.debug(cookie: ***)或者只打前幾個(gè)字符。但代碼是很多人寫(xiě)的靠自覺(jué)不可靠。第二層更穩(wěn)妥的辦法是加Filter。Filter可以在日志事件到達(dá)handler之前修改或丟棄消息。下面這個(gè)Filter會(huì)把常見(jiàn)敏感字段的值替換成掩碼import re class SensitiveDataFilter(logging.Filter): def __init__(self, patternsNone): super().__init__() self.patterns patterns or [ (r(cookie[:]\s*)[^;\s], r\1***), (r(token[:]\s*)[^\s], r\1***), (r(password[:]\s*)[^\s], r\1***), ] def filter(self, record): msg record.getMessage() for pattern, repl in self.patterns: msg re.sub(pattern, repl, msg, flagsre.IGNORECASE) record.msg msg record.args () return True這個(gè)Filter要添加到所有輸出到外部的handler上而不是只加在root logger上。如果你只加在一個(gè)handler上控制臺(tái)能看到原始信息、日志平臺(tái)只能看到脫敏信息這在某些場(chǎng)景下是有意為之的但要注意統(tǒng)一不然排查問(wèn)題時(shí)會(huì)對(duì)著脫敏后的日志干瞪眼。4.4 日志分析工具選型日志采集和分析是生產(chǎn)環(huán)境繞不開(kāi)的一環(huán)。如果項(xiàng)目規(guī)模不大單機(jī)幾臺(tái)服務(wù)器我推薦輕量方案Filebeat Loki Grafana。Filebeat負(fù)責(zé)讀日志文件Loki負(fù)責(zé)存儲(chǔ)和索引Grafana做可視化。這套方案比ELK輕得多對(duì)內(nèi)存的占用只有ELK的幾分之一尤其適合小團(tuán)隊(duì)自己維護(hù)。如果公司已經(jīng)有ELKElasticsearch Logstash Kibana那就直接接入Filebeat把日志推到Logstash或者用Elastic Agent直接發(fā)到ES。因?yàn)槿罩疽呀?jīng)是JSON結(jié)構(gòu)化不需要再在Logstash里寫(xiě)grok解析整個(gè)鏈路會(huì)很流暢。關(guān)于AI工具精準(zhǔn)分析日志我的態(tài)度是AI適合做輔助排查、發(fā)現(xiàn)異常模式、解釋報(bào)錯(cuò)堆棧但前提是日志必須結(jié)構(gòu)和采集做得好。如果日志是一堆無(wú)規(guī)則的文本任何AI工具也很難榨出有效信息。所以第一步永遠(yuǎn)是先把日志結(jié)構(gòu)化和集中化然后再考慮讓AI幫你從海量日志里找線索。我自己用下來(lái)覺(jué)得AI在給出一段報(bào)錯(cuò)、讓它猜測(cè)可能原因這個(gè)場(chǎng)景效率很高但在實(shí)時(shí)監(jiān)控告警上還是規(guī)則和指標(biāo)更可靠。5. 生產(chǎn)環(huán)境實(shí)操一個(gè)可直接落地的完整配置5.1 完整配置包settings、擴(kuò)展、啟動(dòng)命令把前面幾章的東西串起來(lái)我現(xiàn)在給出一個(gè)可以直接抄的配置包。項(xiàng)目的目錄結(jié)構(gòu)大致是這樣myproject/ ├── scrapy.cfg ├── myproject/ │ ├── settings.py │ ├── extensions/ │ │ ├── __init__.py │ │ ├── log_rotation.py │ │ └── site_stats.py │ └── spiders/settings.py里這樣寫(xiě)LOG_ENABLED True LOG_LEVEL INFO LOG_FILE_MODE ab LOG_ENCODING utf-8 LOG_SHORT_NAMES False # 自定義日志擴(kuò)展 EXTENSIONS { myproject.extensions.log_rotation.LogRotationExtension: 100, myproject.extensions.site_stats.SiteStatsLogExtension: 500, } # 擴(kuò)展用到的自定義配置 LOG_DIR logs LOG_BACKUP_DAYS 7 SITE_STATS_LOG_EVERY 500這里的優(yōu)先級(jí)數(shù)字要注意LogRotationExtension的優(yōu)先級(jí)是100SiteStatsLogExtension是500數(shù)字小先執(zhí)行。滾動(dòng)日志的初始化在engine_started時(shí)執(zhí)行而SiteStats在spider_opened時(shí)才開(kāi)始統(tǒng)計(jì)兩者不會(huì)沖突。如果你還用了playwright抓動(dòng)態(tài)頁(yè)面尤其是帶iframe的復(fù)雜頁(yè)面記住一個(gè)經(jīng)驗(yàn)給每次iframe上下文切換和頁(yè)面加載的關(guān)鍵節(jié)點(diǎn)打上spider.info級(jí)別的日志但別在請(qǐng)求循環(huán)里打印完整DOM。我處理過(guò)一個(gè)案例爬蟲(chóng)在抓某個(gè)嵌套三層iframe的頁(yè)面時(shí)偶爾超時(shí)就是靠日志里記錄的iframe加載狀態(tài)才確認(rèn)是某個(gè)廣告iframe一直在刷接口導(dǎo)致的這種問(wèn)題靠肉眼是看不出來(lái)的。5.2 驗(yàn)證與性能壓測(cè)日志系統(tǒng)的瓶頸在哪里配置完之后不要直接上生產(chǎn)先做兩件驗(yàn)證日志是否按預(yù)期切分以及日志IO對(duì)爬蟲(chóng)吞吐的影響。切分驗(yàn)證很簡(jiǎn)單手動(dòng)改系統(tǒng)時(shí)間或者觸發(fā)一次midnight切割比較麻煩可以用whenS和interval3600臨時(shí)跑一小時(shí)驗(yàn)證或者干脆把when設(shè)成H每小時(shí)一切在生產(chǎn)上也夠用我更喜歡按小時(shí)切割便于按小時(shí)粒度去回溯問(wèn)題。驗(yàn)證輸出觀察logs/scrapy.log.2024-06-18這類(lèi)帶日期的歸檔文件是否生成以及scrapy.log本身是否被清空重建。性能方面我的實(shí)測(cè)經(jīng)驗(yàn)是單進(jìn)程500QPS以內(nèi)同步FileHandler沒(méi)有任何壓力超過(guò)1000QPS日志寫(xiě)入會(huì)開(kāi)始拖累主流程尤其是每個(gè)請(qǐng)求打多條DEBUG時(shí)更明顯。解決方案有兩個(gè)方向一是降低日志級(jí)別、減少日志事件數(shù)量二是用異步handler比如QueueHandler配合后臺(tái)線程消費(fèi)。簡(jiǎn)單可用的異步方案代碼import logging import queue from logging.handlers import QueueHandler, QueueListener log_queue queue.Queue(-1) queue_handler QueueHandler(log_queue) queue_listener QueueListener( queue_handler, file_handler, console_handler, respect_handler_levelTrue, ) queue_listener.start()把queue_listener.start()放在擴(kuò)展的engine_started里然后把queue_handler作為root logger的唯一handler。這樣主線程把日志事件丟進(jìn)隊(duì)列就立刻返回真正寫(xiě)文件的IO在后臺(tái)線程做。壓測(cè)下來(lái)在1200QPS的場(chǎng)景下異步方案讓爬蟲(chóng)吞吐幾乎沒(méi)有下降。但這個(gè)方案的代價(jià)是進(jìn)程退出時(shí)可能丟日志所以要在爬蟲(chóng)關(guān)閉時(shí)調(diào)用queue_listener.stop()確保隊(duì)列消費(fèi)完。這里就不展開(kāi)完整生命周期管理了生產(chǎn)使用務(wù)必在spider_closed或close_spider里處理。5.3 監(jiān)控告警日志不只是用來(lái)事后排查日志的最高級(jí)用法是變成實(shí)時(shí)監(jiān)控信號(hào)。我習(xí)慣在項(xiàng)目里實(shí)現(xiàn)一個(gè)爬蟲(chóng)心跳日志每隔固定時(shí)間如果爬蟲(chóng)還在正常產(chǎn)出item就輸出一條心跳日志如果連續(xù)多個(gè)心跳周期沒(méi)有產(chǎn)出監(jiān)控平臺(tái)就會(huì)告警。實(shí)現(xiàn)思路還是依賴(lài)Stats Collector。在上一節(jié)的SiteStats擴(kuò)展基礎(chǔ)上增加一個(gè)計(jì)時(shí)邏輯import time class HeartbeatMixin: def __init__(self, crawler, heartbeat_interval300): self.crawler crawler self.heartbeat_interval heartbeat_interval self.last_item_time time.time() def item_scraped(self, item, spider, **kwargs): self.last_item_time time.time() # 原有統(tǒng)計(jì)邏輯... def _check_heartbeat(self, spider): idle_seconds time.time() - self.last_item_time if idle_seconds self.heartbeat_interval: logger.warning( heartbeat missing: spider%s idle_seconds%s, spider.name, idle_seconds, )然后在settings里用extension連接一個(gè)定時(shí)信號(hào)或者更簡(jiǎn)單地在item_scraped里檢查時(shí)間差。因?yàn)榕老x(chóng)總是在處理item所以這個(gè)檢查不需要額外定時(shí)器。如果爬蟲(chóng)卡死item_scraped本身就不會(huì)觸發(fā)但heartbeat missing日志也會(huì)消失所以需要外部監(jiān)控配合——監(jiān)控平臺(tái)如果沒(méi)有在5分鐘內(nèi)收到該爬蟲(chóng)的任何日志就觸發(fā)告警。這套邏輯我在多個(gè)項(xiàng)目里都用屬于投資小、回報(bào)高的一類(lèi)監(jiān)控。另一類(lèi)告警是基于錯(cuò)誤率。我會(huì)讓擴(kuò)展維護(hù)一個(gè)錯(cuò)誤狀態(tài)碼統(tǒng)計(jì)比如在一個(gè)窗口內(nèi)5xx比例超過(guò)20%就通過(guò)logger.error輸出一條特定前綴的告警日志由監(jiān)控平臺(tái)直接截獲轉(zhuǎn)發(fā)。這樣做的好處是業(yè)務(wù)告警邏輯完全收斂在爬蟲(chóng)項(xiàng)目里運(yùn)維側(cè)只需要配置一條匹配規(guī)則。6. 常見(jiàn)問(wèn)題排查實(shí)錄8個(gè)真實(shí)Case速查日志系統(tǒng)出問(wèn)題翻文檔往往沒(méi)用因?yàn)榫W(wǎng)上都是照抄配置不講為什么。下面這8個(gè)Case是我這幾年實(shí)際遇到過(guò)的整理成速查表?,F(xiàn)象直接原因解決辦法設(shè)置了LOG_FILE但文件是空的LOG_ENABLED被改成False檢查settings和啟動(dòng)參數(shù)控制臺(tái)突然沒(méi)有日志設(shè)置了LOG_FILE后默認(rèn)只寫(xiě)文件按第4章方式自定義雙handler日志隔一段時(shí)間翻倍增長(zhǎng)自定義擴(kuò)展重復(fù)添加handler先remove再add做冪等處理磁盤(pán)被日志撐爆使用了LOG_FILE沒(méi)有輪轉(zhuǎn)用TimedRotatingFileHandler日志中文亂碼FileHandler默認(rèn)編碼不對(duì)LOG_ENCODINGutf-8 或創(chuàng)建handler時(shí)指定日志級(jí)別改了不生效命令行-L參數(shù)優(yōu)先級(jí)更高檢查crawl命令完整參數(shù)某些中間件的日志看不到該中間件用的是第三方logger確認(rèn)root logger級(jí)別必要時(shí)單獨(dú)設(shè)level爬蟲(chóng)崩了但日志里沒(méi)有堆棧異常發(fā)生在信號(hào)回調(diào)里被吞掉在擴(kuò)展和信號(hào)處理里增加try/except并logger.exception逐條展開(kāi)說(shuō)一些寶貴經(jīng)驗(yàn)。第一個(gè)設(shè)置LOG_FILE后文件為空我排查過(guò)好幾次最后發(fā)現(xiàn)是settings.py里某個(gè)環(huán)境判斷邏輯在這個(gè)環(huán)境下把LOG_ENABLED設(shè)成了False。不要覺(jué)得這個(gè)配置沒(méi)人動(dòng)生產(chǎn)環(huán)境經(jīng)常有多套配置互相覆蓋。第二個(gè)控制臺(tái)沒(méi)日志很多人以為是代碼問(wèn)題其實(shí)是Scrapy文件或控制臺(tái)二選一的默認(rèn)邏輯。如果你既想保留控制臺(tái)輸出又想寫(xiě)文件就別用LOG_FILE改用自定義handler。第三個(gè)日志翻倍增長(zhǎng)。這個(gè)最有隱蔽性因?yàn)椴皇菆?bào)錯(cuò)只是日志從某次上線后突然暴增。最后查到是一個(gè)監(jiān)控?cái)U(kuò)展重復(fù)執(zhí)行了root.addHandler每注冊(cè)一次就多一個(gè)handler同一條日志被寫(xiě)N遍。解決辦法是在addHandler之前先遍歷移除同類(lèi)handler或者維護(hù)一個(gè)標(biāo)志變量。第四個(gè)磁盤(pán)被日志撐爆就是第一章的場(chǎng)景。不重復(fù)了。第五個(gè)中文亂碼。Scrapy的LOG_FILE用的是系統(tǒng)默認(rèn)編碼在有些服務(wù)器上是ASCII中文直接變成問(wèn)號(hào)或拋異常。設(shè)置LOG_ENCODING utf-8即可。自定義handler時(shí)記得在FileHandler(..., encodingutf-8)里顯式指定。第六個(gè)日志級(jí)別不生效。有一回我一個(gè)爬蟲(chóng)里設(shè)置custom_settings {LOG_LEVEL: DEBUG}但跑起來(lái)還是INFO。原因是我在命令行用了-L INFO命令行優(yōu)先級(jí)高于custom_settings。所以要檢查完整啟動(dòng)命令別只盯著代碼。第七個(gè)第三方庫(kù)日志丟失。常見(jiàn)的比如selenium的webdriver_manager日志、requests的urllib3日志。Scrapy的root logger默認(rèn)會(huì)捕獲它們但有些庫(kù)創(chuàng)建了獨(dú)立的logger并設(shè)置了propagate False導(dǎo)致日志不會(huì)冒泡到root。處理辦法是顯式設(shè)置該logger的級(jí)別和handler比如logging.getLogger(urllib3).setLevel(logging.WARNING)。第八個(gè)爬蟲(chóng)崩了但沒(méi)堆棧。這個(gè)坑在自定義信號(hào)回調(diào)里最典型。信號(hào)回調(diào)如果拋出異常經(jīng)常會(huì)被Twisted的日志系統(tǒng)捕獲并打到一個(gè)獨(dú)立的logger里如果不仔細(xì)看你只會(huì)看到spider關(guān)閉不知道異常在哪。我在所有擴(kuò)展的公共方法里都加了兜底def _safe_log(self, func, *args, **kwargs): try: func(*args, **kwargs) except Exception: logger.exception(extension method failed: %s, func.__name__)日志系統(tǒng)本身的故障不能影響爬蟲(chóng)主流程這是生產(chǎn)環(huán)境的底線。最后再分享一個(gè)小技巧。排查日志問(wèn)題時(shí)我通常會(huì)先在本地用scrapy crawl myspider -L DEBUG -s LOG_ENABLEDTrue跑一小段把全部日志落到一個(gè)臨時(shí)文件里然后對(duì)比生產(chǎn)環(huán)境的差異。這比直接改生產(chǎn)配置快很多。生產(chǎn)環(huán)境配置日志是個(gè)慢功夫一次配好、持續(xù)觀察、逐步優(yōu)化比出問(wèn)題再救火舒服太多了。希望這篇內(nèi)容能讓你在配置Scrapy日志時(shí)少踩幾個(gè)坑。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
97操碰| 久久久久78| 在线情色电影 91大| 亚洲欧洲成人在线电影| 超碰免费人人| 中文字幕av一区二区三区人妻少妇 | 精品人妻美妇91job| 天天内射| 思思热免费在线视频| 97久久精品亚洲中六字幕| 青青五月天| 9999免费精彩视频| 无码二级三级| 色噜噜国产在线| av黄图片在线观看| 夜夜嗷嗷一区二区| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 小视频国产| 99国产精品免费| 天天日天天干天天色| 午夜成人福利影视| av无线看| 欧美色图97| 在线可观看的黄色网址| 精品人妻一区二区三区鲁大师| 婷婷色中文字幕| 欧美狠狠狠| 亚洲免费看片| 人妻少妇精品| 久插综合| 91社区拍啪人妻| 九区国产| 91呆哥人妻| 超碰综合97在线| 911粉嫩人妻| 9 1果冻精品视频| 91oumei| 久久久久久九九九| 国产乱弄免费在线视频。| 久久精品国产亚洲AV高清演员表| 欧美青青视频| 超碰久久中文| 99热亚洲| 一类av片在线看| 欧美综合中文| 色老牛| 亚洲国产欧美中文永久| 五月丁香六月综合缴清无码| 91青青在线视频| 99ri视频| 日本视频在线观看污污污| 亚洲欧美校园| 神马久久久久久久久久久久| 亚洲精品视频在线播放| 久久久久久人妻一区精品色欧美| 欧美伊人电影| 性老妇一区二区三区| 欧美性爱1080p| 九t超碰| 日韩成人午夜精品久久高潮| 99热18| 加勒比在线视频| av网页一区二区三区| 亚洲图片欧美偷拍| 九九热超碰| 精品国产精品一区二区| 国产操操日韩三级黄| 欧美亚洲天堂| 理论久久婷婷网 8| 人妻插插人妻人| 激情小说成人日本无码一| 色臀AV| 嫩草 人人网精品| 99热91| 黄人人操人人操| 久久婷婷苹果| 亚洲综合 欧美| 花野真衣| 狠狠穞A片一區二區三區| 久久国产乱子伦精品免费女人| 欧美的精品的视频| 亚洲熟女一区二区| 欧美综合狠| 国产白嫩精品久久| 亚洲图片 91| 色婷婷综合网站| 日韩亚洲中文有码视频| 欧美Ⅴ性爱| 欧美后入式| 自拍亚洲综合| 97色色,97综合| 国产极品久久久| 国产伊人自拍| 久久精品亚洲婷婷| 9九九九九视频在线观看| 强奸乱伦av电影| 偷拍亚洲熟女视频播放| 97WW精品| 九九成人视频| 天天射,天天操,天天爽-国内精品一区二区三区-成人AV | ,成人免费啪啪视频| 亚洲av青草久久一区二区| 67914在线兔费成人视频| 久久精品视频一区三区小泽玛利亚| 大香蕉十区| 麻豆国产av网| 欧美精品第四五页中文字幕在线观看| 蜜臀久久99精品久久久久免费观| 中文字日本乱码| 中文字幕91综合| 蜜臀亚洲中文| 第45页一区二区| 嗯嗯嗯啊啊啊在线免费观看| 欧美高潮在线| 黄久在线| 日韩情色一区二区| 国产无码久久高清| xxxx网站亚洲精品| 欧美少妇性爱网站| 久热九九| 5252色欧美在线| 天天做天天爱天天爽AV| 亚洲三级网址久久最新| 91精品人妻五十路| 人人澡人人干| 欧美精品精品一区二区| 久久男人精品| 99久久久99久久91熟女| 久久久久国产亚洲一区欧美色图日韩 | 91成人无码| 中文字幕在线免费观看2| 欧美大片91| 日本成a人v网站在线观看| 熟妇乱伦一区二区| 黄片无码在线制服| 色五月婷婷麻豆在| 午夜福利在线视频1000| 一本大道久| 天天看天天日| 人人操人人摸人人看人人干| 2018色综合天天操| 日韩啪啪啪视频| 91丝袜在线视频| 九9精品| 久久男人的天堂| 亚洲欧美日韩免费电影| av草草在线电影| 色97国产69香蕉| 国产97免费视频| 一级@啪啪视频| 强奸乱伦av电影| 日韩三级一区| 99re在线精品78| 亚欧美综合网| 国产成年免费大片黄在线观看| 立川理惠无码一区二区| 97国伦国色| 碰人碰碰人人开房人肉| 黄色操人| http://qxhbdz.com| 亚州欧美一区| 久久永久无码人妻视频| 在线观看日韩av不卡| www.狠狠干.coom| 夜夜爽爽夜夜精品视频| 黄片免费日韩| 天天干一干| 91成人社区| 国产精品播放| 性爱综合网| 国产白领连续中出在线播放| 在线中文字幕视频| 婷婷九月色| 老司机免费视频在线91| 上海一级黄片| 日欧毛片久久| 午夜男女爽爽爽影院视频| 亚洲成?V人片在线观看福利| 动漫av中文| 探花精品 一区二区| 精品一区二区综合熟妇| 久操 高清| 日韩肏逼视频| 91蜜臀在线久久久久| 香蕉国产97| 18禁中文字幕| 日韩图区| 国产毛片久久久久久久| 亚洲免费97免费| 九九碰九九爱97超| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 东北丰满熟女国产一区| 久操操| 欧美色www亚洲国产阿娇要播| 天天干天天插| 9久久久久久| 操逼逼福利视频| 日本超碰97日韩精品人妻| 亚洲无码com| 搡老女人老妇女老妇老熟女怎么读| 色约约一区=区三区| 强奸乱伦αv片| 好屌色综合| 国产视频一区二区三区在线免费观看| 黄色不卡视频| 亚洲第91页| 天天综合网网欲色| 天天日日日射| 人妻一二三区| 婷婷探花久久精品一区| 青青草操逼逼视频| 精品无码一区二区三区| 69综合网| 国产精品美女在线一区| 国产九九九九九九| 日本超碰在线国产一区| 约操熟妇| 黑人综合色| 午夜黄色免费在线观看| 凌辱美少妇久久aV| 成人AV素股で擦久久| 久久久久久亚洲Av无码精| 人妻在线臀日韩| 性爱乱伦视频免费| 在线洲亚线| 婷婷综合| 欧美视频一| 亚洲视频,小说| 韩国成人精品久久久免费看| 夜夜春夜夜操| 亚洲天堂性爱| 人人看人人爰人人操| 亚洲综合草草| 殴美,日韩国产伦精品| 国产精品福利资源在线尤物| 热热色国产一二区AV| www.99色| 成人日韩3| 97久久久久久久久久| 依人大香蕉| 中国AAAAAA黄色片| 国产精品久久久午夜夜伦鲁鲁| 国产 日韩 欧美 人妻 熟女 中文| 精品九九九九| 日韩青久久| 欧美精品另类人妖xxxx| 无码操逼网| 久艹免费| 先锋音影AV| 色色五月婷| 亚洲欧洲无码bt精品合集| 精品成人女人久久| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 国产高潮AA片免费看| 国产女人视频三四五区| ...日韩成人一区二区三区字幕| 女人高潮大叫一级毛片| 国产 亚洲 一二三四| 日韩丨制服丨中文|在线| 啊啊啊不要好疼视频| 秋霞成人一级在线观看| 久久久99免费| 男人在线天堂| 欧美,亚洲,日韩,v,天堂,手机在线观看| 日韩人妻少妇 一区二区三区| 免费看国产曰批40分钟怎么下载| 久久久97| 啊啊啊啊好爽好舒服一区二区易域| 中文字幕-区二区三区四区视频中国| 日韩中文字幕在线视频观看| 先锋色眉乱伦资源| A 在线网址| 久久狠狠色噜噜狠狠狠狠97 | 精品国产乱码久久久久久影片| 国产99久久99热这里只有精品15 | 久久中文字幕女同性恋一区| 一区 欧美 日韩 麻豆| www.色婷婷| 精品一区二区人妖| 操逼1区| 日韩免费高清大片在线| 国产成人在线观看网址| 欧美日韩精品久久久久久久久东北老熟妇| 啊啊啊啊,啊啊好多水| laoshunv91| 91高跟美女在线播放| 九九精品美女高溯喷水| 99久久这里只有精品| 久久色情| 色情综合网| 亚州欧美综合| 东京热99999| 欧美中字不卡| 久操免费电影| 欧美亚洲今日在线| 97色碰| 偷拍综合网| 亚洲欧美色图| 91色人妻| 欧 美 自 拍 偷 拍| 操b在线观看| 国产精品不卡一区二区电影| 波多野结衣被操50分钟免费视频| 狠狠操官网| 操婢日韩| 思思在线免费视频| 成人网址在线观看| 丁香六月婷婷| 欧美久久草熟女| 天天综合日韩网| 日韩情色视频| 91在线色| 久9综合在线| 巨乳特殊服务按摩| 午夜国产成人精品视频| 欧美的性爱网站免费| 午夜操逼不卡| 欧美一区二区亚洲天堂| 五月丁香影院| 欧洲精品在线播放| 激情四射婷婷六月天| 舔人妻中文免费视频| 欧美性高潮| 综合久久少妇中文字幕| 久久精品中文字幕观看| 91精品大奶人妻| 日韩精品 资源| 天色综合网| 日本熟妇精品九九| 91丨人妻丨国产丨丝袜| 欧美一区二区三区入口| 婷婷激情综合网| av婷婷色网| 看看日B真人视频| 热热色91| 国产AV高清AV无码| 91最新综合| 超碰一区二区| 91网九色蝌蚪操熟女| 日本视频在线观看污污污| 婷婷色网| 老熟妇一区二区三区啪啪| 91美| 欧美日韩国产黄色片| 色婷久久| 人人九九精| 成年无码动漫av片无尽在线 | 国内精品嫩模A∨私拍小视频| 人妻 丝袜美腿 中文字幕| 中出在线视频| 2018天天日天天日| 啊…啊…操我用力操我| 国产蜜臀在线| 性爱视频免费网址| 天天操天天射青青草| 国产情色第一第二页在线观看| 国产精品久久泡妞网站| 久久国产热视频97电影| 美女人妻色网站| 91天天美女| 豆花视频操逼网址| 爱射综合| 亚洲视频精选| 在线国产探花| 超碰97久久国| 国产成人99久久亚洲综合| 亚洲欧洲另类| 精品欧美日韩在线观看| 精品国产乱码| 欧色综合| 国产精品久久久 | 精品999999| 操逼逼无码| 在线观看视频91| 新亚洲无码| 天天干天天拍| 精人妻一区二区三区| 人、人、摸,人、人、草| 超碰综合色| 亚洲影院成人| 天天综合网久久ww| a片 xxxx受爽视频| 日韩AV电影网站| 精品久9| 欧美亚洲丝袜人妻制服99| 中文字幕免费在线观看| 婷婷九月色| 亚洲男人在线观看天堂| 人妻少妇久久久| 玖玖久久久| 日产狠狠干| 青草精品视频一日本久久久久网站| 激情综合网五月婷婷五月天| KK色在线影院| 色色亚洲| 欧美色网| 亚洲中文电影| 亚洲av无线观看| 男人天堂最新手机版在线青青草| 日韩AC| 日韩射图| 狠狠干综合| 大香久久| 亚洲国产综合久久久性感熟妇| 日本道不卡| 国产一区麻豆免费观看| 中国zzijzzijzzwww精品| 日日摸日日碰| 曰韩av中文字幕专区| 91美女片在线| 欧美色图天堂网m| 老外又粗又长一晚做五次| 欧美日韩婷婷中文| 成人乱码一区二区三少妇| 性欧美| 26uuu国产| 成年人黄色视频免费| 中文字幕十五区| 综合影视国产无码| 日躁天天爽爽| 日韩少妇无吗| 精品超碰中文在线| 琪琪精品免费一区二区三区| 五月天AV资源| 久久久啊啊| 人人 操人人 操人人| 蜜臀一二三区| 国产有码一区| 精品国产www久久| 久久久久久久91| 亚洲三级网址久久最新| av天堂5| 777超碰| 国产美女激情| 五月丁香久久| 色久桃花影院在线观看| 精品国产乱码久久久久久蜜臀| 日少妇亚洲版| 久久久人体| 国产传媒操逼视频| 色欧美亚洲| 欧美极品少妇| 2019天天操天天爽天天拍| 日韩精品视频在线观看一卡二卡| 天天躁日日躁狠狠躁| 欧亚揄拍偷拍精品视频 | 色呦呦呦在线观看视频| 超碰在线人人射| 青青草国产一区二区三区| 亚洲欧美中日韩| 无码人妻丰满热妇又大又粗| 韩国免费播放一级毛片| 欧美另类丝袜熟女| 国产精品在线一区二区| 91丝袜美女| 亚洲中文字幕av| 免费1级a做爰片观看| 蜜臀久久久99久久久久 | 伊色久人大在线| 欧亚综合一卡二卡中文字幕| 亚州综合色图| 啊啊啊好大好湿| 懂色AV一区二区三区| 亚洲一区二区性爱电影| 国产视频一区二区三区在线免费观看| 一本色道久久综合精品婷婷| 亚洲麻豆18发?| 午夜欧美J进J出白浆流出久久久| 婷婷久久综合| 五月天综合网| 国模精品娜娜一二三区| 偷拍自拍在线视频观看| 国产www色在线观看| 日韩无码视频黄色| 秋霞色色影院| 欧美黄色手机在线观看| 欧美成人性爱视频在线播放| 91老熟妇| 国产精品操| www亚洲欧美| 欧美性色欧美| 97视频在线观看免费高清| 亚洲,欧美,综合网| 91少妇高潮| 肉丝中文无码高清| 91精品91久久久久77777| 综合色久欲| 天天日熟妇| 九九人妻| 久久久久久十| 国产97在线 | 亚洲| 精品黄色电影| 亚洲 无码 偷拍| 国产婷婷综合在线观看| 天天谢天天干| 99热99在线播放激情| 黄在线| 国产精品女久久久久av爽| 日韩人妻制服丝袜av| 亚洲va有码在线天堂| 操高情无码| aaaa黄片| 日本三级韩三级99久久| 色老汉色| 加勒比伊人综合| 亚洲精品97久久中文字幕| 色路综合| 青娱乐淫乱1314| 亚欧免费| 久久久久9999| 欧美有码亚洲中文字幕一区二区三区四区 | 操死我了嗯嗯嗯| 日本久久999| 亚洲第一页色网| 天美91| 无码区蜜乳| 激情干在线| 久久草草欧美精品| 91性生活久久久| 久久精品男人的天堂| 亚洲激情在线| 激情五月天插| 九九热最新| 蜜臀AV成人精品蜜臀AV久久| 97亚洲国产| 少妇一区二区三区| 亚洲免费成人精品电影| 99少妇精品视频| 亚洲涩涩| 精品一区二区三区丰满熟女-亚洲欧美一区 | 超碰97网址| 天天影视之亚洲综合网| 日韩免费a级毛片无码a∨| 国产精品久久99日日| 婷婷99狠狠| 美女91在线观看| 亚洲综合在线91| 99久久久久久亚洲精品不卡| 啊视频在线| 夜夜嗷嗷一区二区| 亚洲高清综合网| 黄色片,com| 污啪啪啪视频| 97免费视频在线观看视频| 欧美日韩在线小说| 丰满人妻av一区二区三区 | 婷婷久久五月| 亚av顶级裸体一区二区三区四区五区| 欧美性性性| 可以在线观看AV的网站| 国产美女91视频| 久久久久久久久久久久色网| 欧美色性爱| 在线 亚洲 网爆 自拍| 久久二| 精品国产乱码久久久久久口爆网站| 青青青操| 啪啪自拍九九综合| 激情九月婷婷| 色偷偷综合91久久噜噜| 中文字幕一区二区三区高清| 国产一区二区三区不卡手机在线| 色九久| 国产一区二区三区影片| 超碰一区二区| 美中日韩无码| 9999九九九久久久| 麻花豆传媒剧国产MV出差| 精品久久久久9999| 欧美性爱第1 页| 长长久久88视频| 91精品在线播放| 夜夜影视四色| 欧美日韩97在线| 亚洲最新中文字幕免费| 国产欧美成人精品| 三级特黄60分钟播放| 国产白嫩精品久久| 富女玩鸭子一级毛片| 精品久久青青草| 91殴美| 特污免视频| 九九久久玖玖| 淮穴色AV| 中文字幕国产在线天堂| 天天综合有色网| 久久久久久久久久va| 久久久18禁| 欧美性爱免费短视频| 麻豆伊人网| 国产人伦a片信息免费片| 91nbbbbbb| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 91操人| 动漫爆乳3D奶水一区在线观看| 久久久九九| 色综合久| 国产成人亚洲精品无| 日本伦理一区二区| 上海一级黄片| 伊人网在线点播| 亚洲nv男人的天堂网| 丰满人妻区一区二区三| 久久精品一区| 影音先锋乱| 精品免费囯产一区二区三区| 97亚洲综合电影| 1769国内精品视频| 91网站18+| 黄污污污污| 亚洲性爱电影| 蜜桃网熟妇| 欧美精品人妻视频| 日韩欧美成人性爱在线| 久久亚州大香蕉| 色爽爽文学| 精品国产丝袜一区二区三区乱码| 91天天综合在线| 色一射色一射| 无码国产精品久久久久| 91美女小视频| 亚洲图片 激情小说| 婷婷五月激情综合| 欧美亚洲素人制服精品| 91M一社| 大香蕉天天看妹子| 久久人人爽人人爽人人片Ⅴ| 中文操逼字幕| 亚洲,欧美,综合网| 97视频在线观看高清资源| 欧美久久伊人| 国产精品一区二区久久精品| 清纯唯美综合亚洲| 青青草视频导航官网| 日本色婷婷| 日本免费中文字幕在线| 精品亚洲天堂| 精品久久艹| 国产av青草| 欧美性爱在线无码| 日韩性爱毛片操骚逼| 九九九九九精品| 欧美人妻另类在线| 你草精品在线视频| 日本 成 人 小说 电影 一区二区| 性久久| 天天干人人看综合| 97综合激情| 青青操视频在线| 欧美无圣光在线| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 黄色工厂这里只有精品| 亚洲啪啪啪啪视香蕉| 欧美有码亚洲中文字幕一区二区三区四区| 综合色99| 欧美黄片欧美黄片xxx| 99久久久久久亚洲精品不卡| 91精品老女人| 欧美日韩亚洲天堂| 啊啊啊骚| 日本不卡免费二区| 看看日B真人视频| 蜜臀AV成人精品蜜臀| 嗯嗯,啊啊,国产精品| 久久久A∨| 欧美啪啪女女| 久草福利在线资源站| 欧美性爱中文字幕无线码| a片偷拍视频| 色哟哟 日韩精品| 不卡日本一区二区| 久久精品黄色| 精品免费一区| site:sinbotex.com| 91精品人妻一区二区三区蜜桃| 天天综合~91| 久久精品国产97欧美精品亚洲 | 翔田千里AV无码秘 三区| 国产精品一区二区三区免费视频| AV有码在线| 五月天婷婷社区| 一本久久久精品| 欧美高清91| 国产精品乱码久久久| 老女人综合| 天天噜| 欧美色图综合| 天天射天天| 亚洲色图尤物视频| 操操操日本的逼| 九九探花视频在线观看| 成人性爱电影网| 99自拍视频在线| 激情婷婷五月天| 九九视品黄色| 国产超碰在线一区| 后入式视频国产自| 成人九九| 91欧美亚洲| 三级日本一区二区三区| 国产成人午夜视频网址| 久久国内| 日本免费中文一区二区三区四区 | 日韩性爱再线视频| 99爱在线视频| 日韩美女久久一区二区三区| 欧美在线l亚洲| 九久久精品| 94色色电影网| 韩国一级婬片A片无码天美| 久久人人舔人人爽舔人人av片| 激情啪啪拍91| 2020视频1区2区3区| 欧美日韩人人早| 怡红院亚洲怡春院av| 78超碰| 午夜激情成人在线观看| 国产一区二区视频在线播放| 久久久精品日本一道| 久草毛片电影怡| 色天天野狼综合社区| 天天日天天干天天操| 在线观看免费视频国产| 婷婷99狠狠躁天天躁| 欧美性色综合网| 97中文字幕一区| 男女啪啪网站免费视频| 粉嫩不卡一区二区性爱| 中文字暮97| 青青草无码视频| 中文字幕精品探花视频| 久久精品国产96精品亚洲拳交| 久久精品国产精品亚洲艾通辽熟妇| 啊啊啊97视频| AV女优男人的天堂| 亚洲成人av电影在线| 熟妇熟女亚洲天堂网| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 激情综合97| 欧亚日韩综合精品国产| 女性喷水高潮在线观看| 乱伦熟女区| 中文字幕人妻色偷偷久久皮| 精品国产AV一区天美传媒| 亚洲欧美自拍偷拍| 18一区二区三区| 天天久久久久久| 国产一进一出视频网站| 116美女午夜| 精品无人区麻豆乱码1区2区图片 | 亚洲中文字幕熟女| 99久久九九| 蜜臀av网址| 一区二区三区在线美女| 台湾佬激情综合| 蜜桃臀av一区二区| 97国产高清视频在线观看| 青青草精品| 3PAV乱伦视频| 亚洲精品一区中文字幕乱码| 天天日骚逼熟女| 芊芊操逼视频无码| 91天堂视频| 国产无码精品无码| 国产亚洲 中文欧美久久| av天堂加勒比| 国产日韩欧美三级片| 欧美中字不卡| 2019天天干天天操| 国产亚洲精品美女| 亚洲 自拍偷拍 欧美| 麻豆福利视频导航| 国产福利电影| 丝袜喷水在线| 大香蕉乱级| 久久成年精品| 天天躁日日躁AAAAXXXX国产| 99热精品国产| 亚洲 欧美 偷拍 唯美| 欧美日韩精品国产91| 免费的黄片有限公司| 色婷婷婷五月天激情四射| 男女做爰猛烈动高潮A片免费应用 少妇厨房愉情理伦片bd在线观看 不卡中文字幕aⅴ在线 | 国产精品一区二区三区在线密挑| 熟女少妇视频| 亚洲另类综合欧美| 久久久96| 欧美天天综| 精品久久无码午夜福利 | 亚洲色综合| 美女高潮国产高清| 天天欧美欧美亚洲网| 97欧美视频| 色盈盈影院| 少妇人妻好深太紧了vr91| 和协影院中文字幕三区| 亚洲色图日韩精品| 亚洲丨在线| 美女露胸露尿口| 日韩一区二区精彩视频| 久久动漫精品视频这里只有精品| 欧美顶级黄色大片免费| 亚洲区小说| 91在线页| 影音先锋少妇| 国产后入清纯| 日本色婷婷| 亚洲āv网址在线观看| 91天天爱| 久久9视频| AAAA级日本片免费视频| 99re只有精品| 日本在线播放不卡一区| 国产精品欧美在线观看| 久久超碰、| 91在线精品| 精品黄色电影| 色综和网| 丁香久久| 懂色中文一区二区三区| 日本免费一区二区不卡 | 日本韩欧美在线播放a| 9久精品| 97天天弄| 六月色婷婷| 乱伦a片视频| 综合色欧美| 美欧老女人97| 久久久久久久人妻| 亚洲天堂一区二区久久| 午夜啊啊| 精品一国2| 精品国产一区二区三区av在线资源| 无码高清操逼网址| 日韩欧美女求操每天更新| 330Dv国产女人终合视频极品人与兽| 国产三级日产三级韩国三级 | 噜噜瑟| 中国黑人三级片网站上区| 综合色99| 亚洲精品一二区| 天天影视亚洲| 欧美线天码中字| 美女的肌被草喷水视频| 激情五月天色色| 亚洲天堂一区二区久久| 久久久久久久久久9| 超碰地址97| 69超碰综合| 色色色色网站| 亚洲字幕一区二区| 人妻色偷色噜| 黄页| 久肏视频字幕| 亚洲精品1区| 亚洲AO在线| 熟女人妻久久中文字幕一二区| 国产乱码精品一区二区三区四川| 婷婷av在线中文字幕| 亚洲自拍97| 91精品在线播放| 色妇91| 精品无码一二三四区| 日韩偷拍色图| 婷婷五月天小说| 1769精品一区二区三区| 韩国黄片aaaa| 最新日日夜夜天天干干| 久草加勒比一区在线| 33044男人的天堂深夜备| 熟女网站最新| 色婷婷婷五月天激情四射| 亚洲 中文 女同| 国产亚洲 中文欧美久久| 婷色五月| 99久热| 精品久久99| 任你爽视频| 五月丁香综合啪啪| 色婷视频| 丁香五月激情啪啪| 婷婷九月色| 能看的AV| 67914亚洲精品| 密桃99999| 亚洲天堂男人在线| 最新AVzaixian| 久热色情精品| 天堂资源欧美| 操B久久| 欧美乱妇狂野欧美在线视频| 九九亚洲精品| 好屌色综合| 中国熟女91| 97超碰国产亚洲精品| 黄站在线免费观看| 天天综合~91| 2020中文字幕在线观看| 久艹日日日| 天天综合91| AV天堂国产| 老熟女乱子伦中文字幕一区二区| 久久久亚洲欧美综合| 日本午夜福利影院| 婷婷丁香六月| 日本三级小说中文字幕| juliaann丝袜大战黑鬼| 中出后入| 超碰久久.com| 欧美综合网| 家庭乱伦国产| 亚洲精品aa久久伊人| 97久久久| www.操| 大香蕉综合在线| 日韩97超碰| 色综合加勒比| 国产精品人人爽人人做可爱福利| 国产午夜激片Av毛片不卡| 青草av在线| 成年男人的天堂| 欧美午夜视频| 夜夜夜夜久久久久| 久操91视频| 久久精品店| 成年女人一区| 青青三级视频| 女优大全 - 91n| 国产一区二区三区白丝| 欧美一级A片在线看视频性色| 亚 欧 美 综合| 欧美日韩天堂| 天久久久噜噜噜久久国产精品爽爽| 91AV入口| 色婷婷导航| 1区2区3区中文字幕日韩| 高清无码学生妹高潮| 夜夜草天天| 静品嫩模一区二区| 欧美 亚洲 大香| 久久婷婷一区| 日本人妻中文字幕| 综合五月婷婷| 牛牛久久国产精品视频一二三| 中文字幕激情小说| 夜夜天天噜狠狠爱2021| 国产成人亚洲精品自产在线| 九九九精品一区二区无码| 先锋女优在线观看视频| 欧美大香蕉同搞| 极品丝袜无码| 97在线观看视频| 免费日韩黄片| 国产熟女少妇一区| 婷婷九月丁香| 亚洲阿v天堂无码z2018| 白嫩嫩一区| 人妻精品一区一区三区蜜桃91| 色呦呦国产精品免费看| 综合色99| 狠狠干妹子| 亚洲高清无毛一区二区| 欧美色偷拍| 国产亚洲精品久久久久小| 婷婷激情啪啪| 精品人妻一区二区三区蜜桃视频| 99视频这有这里有精品| 麻豆视频test| 91狠狠综合久久| 丝袜美腿制服人妻二区中文字幕 | 国产 日韩 另类 视频一区爱| 青青草吊丝| 凹凸精品熟女在线观看| 狠狠色综合网| 亚洲 中文 欧美 日韩 在线| 天天色天天干天天爱| 日韩AV中文字幕电影| 亚洲一二三四区| 99啪啪| 男人天堂无码| 午夜寂寞欧美| 亚洲自拍欧美色综合| 性爱网站一区二区| 顶级少妇BT天堂| 日韩免费a级毛片无码a∨| 美女黄色一级A视频| 凹凸 69堂 在线播放| 亚欧高清v| 综合情欲网| 免费操逼视频下载| AV男人天堂网| 美女黄频a美女大全免费皮| 加勒比东京热五月天天堂网| 嗯啊视频免费在线观看| 欧美在线l亚洲| 色就色综合| 日韩资源网| 亚洲欧洲精品视频发布| 97热视频在线观看| 人人妻人人狠人人| 日韩有码回春沙龙第一页| 俺去俺来也在线www| 国产精品69久久久久孕妇欧美| 青草青草久热| 欧美色老汉| 五月婷婷激情| 狠狠操狠狠操操| 嗯嗯嗯啊啊啊操的我好爽| 欧美福利视频啊啊啊啊| 神马久久久久久久久久| 成人一级性爱| 欧美骚少妇| 欧美性爱五月天| 亚洲丝袜综合| 国产精品午夜成人福利| 国产精品熟女九色九色蜜臀| 天天干夜夜肏| 激情综合亚洲| 极品销魂美女一区二区| 美腿丝袜偷拍亚洲欧美| 操逼逼中文字幕| 欧美偷| 久久免费中文字幕在线观看| 日韩黄片影院| 欧美第一页| 男人天堂一区二区| 欧美成人性爱视频在线播放| 97超碰久久色| 五月丁香激情综合| 免费观看日本操逼视频| 麻豆一区在线| 日韩成人电影AV| 色网站导航大全| 97频视在线| 天天天天操| 豆花视频操逼网址| 色九色久| 麻豆AV一区二区| 精品亚洲黄色片 国产精品导航一区二区 | 成人在线视频网| 啊啊啊啊网站| 亚洲国内精品成人不卡| 激情开心五月天| 操B视频日韩无码| 玖色av| 97超碰色屌| 亚洲啪啪性视频| 国产精品国产亚洲区艳妇糸列| 国产麻豆一区二三区| 射 色综合| 欧美日韩国产高清在线一二三区 | 蜜桃精品视频一区二区三区| 超碰97精品在线| 亚洲暴力强奸AV| 亚洲天堂久久久久久粉红视频| 青青伊人久久| 九九精品美女高溯喷水| 亚洲欧美在线观看2021| 秋霞色色影院| 高潮9999外国| 丰满精品人妻少妇久久字幕| 天堂岛av| 蜜乳AV一区二区三区四| 亚洲av成人精品一区| 一本色道久久综合亚洲二区三区| 麻豆久久久久久久久丝袜| 人人扣人人操| 一类无码操逼视频| 另类图片综合| 久久久久国色αv免费观看| 蜜桃久久久久久久久久久久| 亚洲天天艹| 国产免费永久精品无码| 欧美αv.com| 一起草三级AV电影在线观看 | 亚洲少妇在线影音| 老女人爆菊| 日本久久99| 精品在线观看视频在线| 中文字幕日韩电影人妻| 97欧美| 91国产丝袜白虎| 色情婷婷久久五月天| 又摸又舔在线观看网站| 熟女丰满人妻一区| 99色在线观看| 久久精品国产亚洲AV成人直播| 性爱Av免费| 精品日韩人妻精品一二三区| 9丨久久九九九| 超碰超碰超碰超碰的大鸡吧操黑丝袜| 超碰欧美在线欧美| 日本精品免费一区二区三区四区| 少妇蜜汁| 日韩在线视频1234| 五月开心网| 色色激情五月天| 日韩中文字幕二区| 久久久免费一级黄片| 亚洲精品一区二区三区在线播放| 特级特黄一级毛片免费| 国产精品日本无码A片| 国产精品不卡高清在线观看| 天天综合-91入口| 躁躁躁日日躁2020| 人人扣人人操| 白嫩国模丰满一二三区| 成人性爱美曰韩| 91人妻尻屄视频| 熟女视频久久| 啊视频在线| 丁香五月激情啪啪| 天天爱天天韩国日本牛牛牛牛| 欧美在线干| 五月天激情国产综合婷婷婷| 伊人色综合网| 亚洲欧洲偷拍一区| 国产女上位好爽在线| 偷窥自拍亚洲色图| 亚洲宗合电影| 久久久久久波多野吉衣高潮| 好看的久久不射无码影视影院| 精品一区二区三区四区外站| 亚洲自拍欧美色综合| 欧美日韩人妻少妇 一区二区三区| 啊啊啊久久久视频| 97日韩欧美亚洲| 久久久不卡| 国产操逼网站亚洲一级黄色| 天天视频网站黄| 乳欲人妻办公室奶水| av天堂5| renqi久久久久久久久久久久| 欧洲天天在线| 九九成人精品| 嫩草 我啊~嗯~在线| 超碰97人妻自拍| 久久久96| 激情抓乳插进去啪啪啪日韩 | 欧美综合骚| 91av天美性媒精品视频| 国产视频第2页| 91美女精品| 手机看片91人妻| 久久毛卡| 五月丁香啪啪啪| 久久久久久久久久久久黄色 | 天美传媒婬乱在| 日韩黄色av中文字幕| 99热这里只有精品地址| 久久超碰爱| 久啪| 2017天天插| 亚洲另类小说卡通动漫| 亚洲欧美中文日韩视频中国语| 九九无码久久精品视频| 69久久久久久久久久久久久| 99热在线只有精品| 国产福利一区二| 亚洲操人|