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

輕松打造高效日志系統

系統 開發
本文介紹了如何設計并實現高效日志系統,介紹了一個有效的日志系統需要考慮的關鍵問題,強調了日志在系統調試和監控中的重要性。

作為開發者,經常需要在調試時查看檢查日志,缺乏日志或者不清楚如何通過日志分析問題,就無法定位出錯的代碼。

對于每天為成千上萬甚至上百萬用戶提供服務的系統來說,日志必不可少,因為:

  • 日志可以幫助我們找到影響最終用戶的錯誤。
  • 日志可以跟蹤系統的 "健康狀況",在系統出問題之前察覺到某些 "異常跡象"。
  • ……等等

由此可見,在開發或運行系統時,日志至關重要,因此,設計和實施完善的日志系統有助于簡化監控工作。

本文將分享我在設計和構建日志系統方面的經驗和理解。希望通過這篇文章,你能:

  • 了解在操作系統中記錄日志的重要性。
  • 可以作為實施日志系統時的參考。

一、日志策略

下面列出了我們在實施日志系統之前應該問自己的問題。

  • Why(為什么):日志記錄的目的是什么?
  • Who(誰): 哪個模塊將生成日志?
  • When(何時):何時輸出日志?
  • Where(哪里):在哪里輸出日志(發送到 Slack 或 BigQuery 等)
  • What(什么):日志能提供什么信息?
  • How(如何): 如何輸出日志?

二、日志級別

了解日志的目的后,應該對日志進行分級

Log level

Concept

How to handle

Example

FATAL

This Level hinder the operating of the system

Have to fix immediately

Can not connect to the DB

ERROR

Unexpected errors occur

Should be fixed as soon as you can

Can not send the email

WARN

Not an error, but are some problems like unexpected input or unexpected executing unexpected input or unexpected executing

Should be refactored regularly

Regularly delete data API

INFO

Notification when starting or ending an executing or a transaction.

Maybe outputting another needed information

Do not need to fix Output the body of the request or response

DEBUG

The information that relating to system status

Do not output in the production environment

Can be put inside a function

TRACE

Information that is more detailed than DEBUG

Do not output in the production environment


三、案例

定義日志級別后,必須明確要輸出的日志類型。

本節將針對每種日志類型回答以下六個問題。

  • Why(為什么)
  • Who(誰)
  • When(何時)
  • Where(哪里)
  • What(什么)
  • How(如何)

1. 系統日志(System Log)

(1) Why: 當系統出現錯誤時,系統日志將用于調試。

(2) Who: 系統本身將輸出日志。

(3) When:出錯時輸出日志。

(4) Where:

  • FATAL / ERROR:通知開發人員立即處理。
  • WARN / INFO:在系統或日志管理工具中輸出。
  • DEBUG / TRACE:輸出到預發環境中的 console.log。

(5) What:

  • FATAL / ERROR:堆棧跟蹤。
  • WARN / INFO / DEBUG/ TRACE:要通知的內容。

(6) How:

  • FATAL / ERROR:通過日志管理工具或 Slack、SMS......(推模式)輸出。
  • WARN / INFO / DEBUG / TRACE:通過日志管理工具或系統內部輸出(拉模式)。

2. 訪問日志(Access Log)

  • Why: 輸出日志以跟蹤發送和接收請求的過程。
  • Who: 系統本身或基礎設施。
  • When: 在發送或接收請求時輸出。
  • Where: 在 INFO 級別和拉模式中。由于日志量可能很大,必須注意查找日志的速度。
  • What: 輸出誰、如何、何時進入系統。
  • How: 根據目的不同,可能會有一些差異。

3. 操作日志(Action Log)

  • Why: 分析用戶操作,從而在此基礎上改進服務。
  • Who: 系統本身或外部工具。
  • When: 某些操作發生時。
  • Where: 日志分析工具(BigQuery 等)。
  • What: 取決于目的。
  • How: 根據目的不同,可能會有一些差異。

4. 認證日志(Auth Log)

  • Why: 跟蹤用戶驗證的輸出。
  • Who: 系統本身。
  • When: 驗證用戶。
  • Where: 在 INFO 級別和拉模式中。
  • What: 輸出認證的時間、用戶、方式。
  • How: 根據認證方法不同,可能會有一些差異。

四、示例

概念就介紹到這里,下面來看一個示例項目。

有關代碼的更多詳情,請參閱Github[2]。

1. 選擇日志庫

我選擇 log4js[3] 庫,原因很簡單,因為 log4js 構建日志級別的方式與我的想法一致。

2. 實施

步驟 1 - 定義日志類

首先定義日志類:

class Logger {
  public default: log4js.Logger;
  public system: log4js.Logger;
  public api: log4js.Logger;
  public access_req: log4js.Logger;
  public access_res: log4js.Logger;
  public sql: log4js.Logger;
  public auth: log4js.Logger;

  public fatal: log4js.Logger;
  public error: log4js.Logger;
  public warn: log4js.Logger;
  public info: log4js.Logger;
  public debug: log4js.Logger;
  public trace: log4js.Logger;

constructor() {
    log4js.configure(loggerConfig);

    this.system = log4js.getLogger('system');
    this.api = log4js.getLogger('api');
    this.access_req = log4js.getLogger('access_req');
    this.access_res = log4js.getLogger('access_res');
    this.sql = log4js.getLogger('sql');
    this.auth = log4js.getLogger('auth');

    this.fatal = log4js.getLogger('fatal');
    this.fatal.level = log4js.levels.FATAL;

    this.error = log4js.getLogger('error');
    this.error.level = log4js.levels.ERROR;

    this.warn = log4js.getLogger('warn');
    this.warn.level = log4js.levels.WARN;

    this.info = log4js.getLogger('info');
    this.info.level = log4js.levels.INFO;

    this.debug = log4js.getLogger('debug');
    this.debug.level = log4js.levels.DEBUG;

    this.trace = log4js.getLogger('trace');
    this.trace.level = log4js.levels.TRACE;
  }
}

在 Logger 類中定義了日志級別:

  • fatal
  • error
  • warn
  • info
  • debug
  • trace

基于此,我又定義了日志類型:

  • system
  • api
  • access_req
  • access_res
  • sql
  • auth

第 2 步 - 將 Logger 應用到項目中

將 Logger 類應用到由 NestJS[4] 框架實現的項目中。

通過 NestJS 的 Interceptor(攔截器[5])功能,將日志類注入到項目中。

選擇 Interceptor 的原因是 NestJS 攔截器不僅能封裝請求流,還能封裝從 API 輸入和輸出的響應流,因此使用攔截器是捕獲請求日志和響應日志的最簡單方法。我是這樣定義 LoggerInterceptor 類的:

export class LoggerInterceptor implements NestInterceptor {
  intercept(
    context: ExecutionContext,
    next: CallHandler<any>
  ): Observable<any> | Promise<Observable<any>> {
    // intercept() method will "wrap" request/ response stream

    /*
     * Get request object from context
     * After that, pass request object to "requestLogger" function
     * to output the log
     */
    const request = context.switchToHttp().getRequest();
    requestLogger(request);

    /*
     * Get response object from context
     * After that pass response object to "responseLogger" & "responseErrorLogger" functions for ouputting the log or
     * error log
     */
    const response = context.switchToHttp().getResponse();

    return next.handle().pipe(
      // 200 - Success Response
      map((data) => {
        responseLogger({ requestId: request._id, response, data });
      }),
      // 4xx, 5xx - Error Response
      tap(null, (exception: HttpException | Error) => {
        try {
          responseErrorLogger({ requestId: request._id, exception });
        } catch (e) {
          logger.access_res.error(e);
        }
      })
    );
  }
}

定義了三種方法:

  • requestLogger: 用于記錄請求信息。
  • responseLogger: 用于記錄響應信息。
  • responseErrorLogger: 用于記錄錯誤信息。

像這樣:

const MaskField = {
Email: 'email',
Password: 'password',
} asconst;

type MaskField = (typeof MaskField)[keyof typeof MaskField];

const _maskFields = (object: FixType, fields: MaskField[]): FixType => {
const maskOptions = {
    maskWith: '*',
    unmaskedStartCharacters: 0,
    unmaskedEndCharacters: 0,
  };

for (let i = 0; i < fields.length; i++) {
    switch (fields[i]) {
      case MaskField.Email: {
        object[MaskField.Email] = maskData.maskEmail2(
          object[MaskField.Email],
          maskOptions
        );
      }
      case MaskField.Password: {
        object[MaskField.Password] = maskData.maskPassword(
          object[MaskField.Password],
          maskOptions
        );
      }
    }
  }

return object;
};

exportconst requestLogger = (request: Request) => {
const { ip, originalUrl, method, params, query, body, headers } = request;

// logTemplate includes: now(time), ip, http_method, url, request_object
const logTemplate = '%s %s %s %s %s';
const now = dayjs().format('YYYY-MM-DD HH:mm:ss.SSS');

const logContent = util.formatWithOptions(
    { colors: true },
    logTemplate,
    now,
    ip,
    method,
    originalUrl,
    JSON.stringify({
      method,
      url: originalUrl,
      userAgent: headers['user-agent'],
      body: _maskFields(body, [MaskField.Email, MaskField.Password]),
      params,
      query,
    })
  );

// Using access_req logger object have been defined before.
  logger.access_req.info(logContent);
};

// Ouptput success response log
exportconst responseLogger = (input: {
requestId: number;
  response: Response;
  data: any;
}) => {
const { requestId, response, data } = input;

const log: ResponseLog = {
    requestId,
    statusCode: response.statusCode,
    data,
  };

// Using access_res logger object have been defined before.
  logger.access_res.info(JSON.stringify(log));
};

// Ouptput error response log
exportconst responseErrorLogger = (input: {
requestId: number;
  exception: HttpException | Error;
}) => {
const { requestId, exception } = input;

const log: ResponseLog = {
    requestId,
    statusCode:
      exception instanceof HttpException ? exception.getStatus() : null,
    message: exception?.stack || exception?.message,
  };

// Using access_res logger object have been defined before.
  logger.access_res.info(JSON.stringify(log));
  logger.access_res.error(exception);
};

定義完 LoggerInterceptor 后,將此攔截器應用到應用程序中:

const app = await NestFactory.create(AppModule);

app.useGlobalInterceptors(new LoggerInterceptor());

在 NestJS 應用程序中應用自定義攔截器并不難,因為這是 NestJS 的內置功能。

對于 fatal 和 debug 日志,我將在用例層或基礎架構層中使用,以達到以下目的:

  • 通知無法連接數據庫等致命錯誤。
  • 當用戶遇到問題時進行調試。

只要這樣做:

logger.fatal.error('Error message');

可以將 fatal 日志輸出到控制臺或 Slack 等通知管道......

結果如下:

首先是訪問請求日志和響應日志(當沒有發生錯誤時)。

可以看到,與請求相關的信息,如 method、body 等都已清晰顯示。

如果出錯:

同時顯示錯誤類型和錯誤信息。

fatal 日志會是這樣的:

同樣會輸出錯誤信息和錯誤類型。

五、結論

本文分享了如何設計和實施一個基本的日志系統。

通過簡單的示例,希望你能理解建立日志系統的重要性和必要性,這將有助于系統的運行和調試。

參考資料:

  • [1] Design And Building A Logging System: https://levelup.gitconnected.com/design-and-building-a-logging-system-fd5dcad110ed
  • [2] NewAnigram-BE-DDD: https://github.com/tuananhhedspibk/NewAnigram-BE-DDD
  • [3] log4js: https://github.com/log4js-node/log4js-node
  • [4] NestJS: https://docs.nestjs.com
  • [5] NestJS Interceptor: https://docs.nestjs.com/interceptors
責任編輯:趙寧寧 來源: DeepNoMind
相關推薦

2025-07-14 05:00:00

監控系統工具

2023-11-16 08:53:05

NumPy庫Python

2011-01-19 10:42:15

2024-01-03 10:03:26

PythonTCP服務器

2010-06-23 11:41:00

高校企業高效數據中心

2009-05-05 13:19:53

戴爾高效企業

2010-02-22 15:00:47

2019-12-12 09:30:31

工具代碼開發

2012-08-06 11:55:10

災備系統深信服易寶支付

2025-01-03 09:34:54

2010-01-11 15:12:30

VB.NET特殊窗體

2009-12-11 15:37:58

Linux日志處理

2013-08-13 14:11:39

2025-05-12 10:02:05

2010-05-12 15:39:49

IT運維信息化建設北塔

2014-10-27 14:09:01

華為

2024-06-13 10:52:43

2010-01-14 11:00:48

VB.NET文件合并
點贊
收藏

51CTO技術棧公眾號

欧美三级蜜桃2在线观看| 精品一区二区成人精品| 亚洲激情电影中文字幕| 欧美成人免费高清视频| 里番在线观看网站| 成人免费视频播放| 国产精品视频99| 九九视频在线免费观看| 精品一区亚洲| 日韩欧美在线不卡| 性生交免费视频| 在线中文字幕电影| 久久久久久久久伊人| 91影视免费在线观看| 国产成人在线视频观看| 在线看片不卡| 亚洲区中文字幕| 精品人妻无码中文字幕18禁| 激情亚洲影院在线观看| 亚洲国产视频直播| 一区二区三区四区国产| 深夜福利视频在线免费观看| 久久66热re国产| 欧美亚洲另类视频| 国产在线观看99| 99热国内精品| 亚洲香蕉伊综合在人在线视看| 人妻激情偷乱视频一区二区三区| 天天免费亚洲黑人免费| 亚洲午夜在线电影| 97超碰免费观看| 东热在线免费视频| www国产亚洲精品久久麻豆| 亚洲www视频| 最近中文字幕在线免费观看| 国产精品久久国产愉拍| 欧美激情2020午夜免费观看| 天天色天天综合| 国产亚洲电影| 亚洲欧美一区二区三区四区| 免费看毛片的网站| 91蝌蚪精品视频| 欧美一区二区三区视频在线观看| 亚洲xxxx2d动漫1| 成人福利av| 丁香五六月婷婷久久激情| www.好吊操| 日韩精品亚洲人成在线观看| 亚洲男人的天堂av| 一二三四中文字幕| 中文字幕伦理免费在线视频 | 韩国三级hd两男一女| 免费观看亚洲天堂| 欧美一区二区女人| 制服下的诱惑暮生| 亚洲日本va午夜在线电影| 欧美一区三区二区| 中文在线字幕观看| 国产成人澳门| 亚洲精品国产电影| 亚洲永久无码7777kkk| 国产女人18毛片水真多18精品| 精品美女一区二区| 99久久免费看精品国产一区| 免费看久久久| 亚洲欧美日韩国产成人| 免费人成又黄又爽又色| 久久一区二区三区喷水| 美女国内精品自产拍在线播放| 成人免费精品动漫网站| 欧美日韩精品| 欧美亚洲第一区| 免费看av在线| 激情综合色播五月| 懂色中文一区二区三区在线视频| 欧美视频一二区| 国产亚洲精品中文字幕| 日本视频一区二区不卡| 97人人在线| 一级做a爱片久久| 亚洲熟妇av日韩熟妇在线| 日韩成人动漫| 91麻豆精品国产自产在线| 中文字幕久久久久久久| 小说区图片区色综合区| 亚洲午夜久久久久久久| 日本在线一级片| 亚洲伦伦在线| 国产精品视频公开费视频| 国产成人精品一区二区无码呦| 成人深夜福利app| 日韩高清av| 日本伦理一区二区| 色999日韩国产欧美一区二区| 亚洲天堂国产视频| 好吊妞视频这里有精品| 宅男66日本亚洲欧美视频| 免费在线观看黄色av| 久久福利影视| y111111国产精品久久婷婷| 精品视频二区| 亚洲视频免费在线| 男人靠女人免费视频网站| 日韩毛片网站| 亚洲欧美精品中文字幕在线| 破处女黄色一级片| 激情视频一区二区三区| 国产欧美最新羞羞视频在线观看| 天堂av中文字幕| 亚洲视频小说图片| 99视频在线免费| 国内毛片久久| 欧美日本在线视频中文字字幕| 日日夜夜操视频| 成人美女在线视频| ijzzijzzij亚洲大全| 色香欲www7777综合网| 精品国产亚洲在线| 欧美风情第一页| 毛片一区二区三区| 欧美尤物一区| 亚洲欧洲日本韩国| 精品国产123| 久久久久久久久久久久久女过产乱| 丝袜脚交一区二区| 看欧美日韩国产| 美女高潮在线观看| 精品国精品国产尤物美女| 任我爽在线视频| 日本成人在线视频网站| 欧美日韩精品免费观看| 大菠萝精品导航| 精品久久人人做人人爰| 91人妻一区二区三区蜜臀| 久久精品国产亚洲高清剧情介绍| 午夜精品一区二区三区在线观看 | 亚洲自拍欧美另类| 无遮挡的视频在线观看| 欧美亚洲图片小说| 国产伦精品一区二区三区视频女| 久久精品电影| 欧美精品七区| 欧美一级大黄| 精品一区二区三区电影| 久久久久亚洲av成人毛片韩| 99久久免费视频.com| 99在线精品免费视频| 亚洲欧美日本国产| 久久久久久久久久国产精品| 丰满熟妇乱又伦| 亚洲午夜精品17c| 国产在线不卡av| 亚洲二区免费| 久久久久久a亚洲欧洲aⅴ| 天堂中文最新版在线中文| 亚洲精品电影在线| 中文字幕av影院| 欧美韩国日本综合| 欧美三级午夜理伦三级富婆| 99成人在线视频| 91在线视频精品| 好久没做在线观看| 日韩精品免费电影| 日本视频www色| 最好看的中文字幕久久| 国产精品日日摸夜夜爽| 国产一区白浆| 亚洲精品无人区| 国产亚洲精aa在线看| 欧美高清在线观看| 天天躁日日躁狠狠躁伊人| 欧美特级www| 美国黑人一级大黄| 国产精品一区二区久久精品爱涩| www.好吊操| 国产精品片aa在线观看| 成人国产精品色哟哟| 蜜桃成人365av| 亚洲系列中文字幕| av资源免费看| 欧美色欧美亚洲高清在线视频| 波多野结衣av在线观看| 国产在线精品一区二区不卡了| 欧美黑人在线观看| 禁断一区二区三区在线| 亚洲综合成人婷婷小说| 精品三级久久| 中日韩午夜理伦电影免费 | 影音先锋欧美资源| 动漫视频在线一区| 国产精品流白浆视频| 欧美aaaaaaa| 中文一区二区视频| 蜜桃91麻豆精品一二三区| 色狠狠av一区二区三区| 欧美色图一区二区| 久久精品一区二区三区不卡牛牛| 性久久久久久久久久久久久久| 亚洲精选国产| 午夜在线视频免费观看| 亚洲国产精品嫩草影院久久av| 国产日韩中文字幕在线| 色偷偷色偷偷色偷偷在线视频| 精品国产一区二区三区久久久| 色欲av永久无码精品无码蜜桃 | 欧美一级精品| 国产私拍一区| 久久gogo国模啪啪裸体| 国产精品wwww| 竹内纱里奈兽皇系列在线观看| 久久亚洲精品一区二区| 国产资源在线看| 亚洲精品黄网在线观看| 国产不卡av在线播放| 欧美综合欧美视频| 影音先锋亚洲天堂| 亚洲日本韩国一区| 91麻豆制片厂| 国产清纯白嫩初高生在线观看91| 国产精品久久久久久亚洲色 | av网站网址在线观看| 伊人成人开心激情综合网| 午夜在线视频免费| 精品日韩在线一区| 国产三级在线观看视频| 欧美日韩一二三| 国产真人无遮挡作爱免费视频| 亚洲成人免费在线| 久久人人爽人人爽人人| 一区二区三区四区乱视频| 三级影片在线观看| 欧美国产成人精品| 国产传媒国产传媒| 久久美女高清视频| 国产精品九九九九九| 99国产精品久久久久| 大桥未久恸哭の女教师| 成人性色生活片免费看爆迷你毛片| 99re6在线观看| 美腿丝袜亚洲三区| 手机看片一级片| 美女爽到高潮91| wwwwwxxxx日本| 久久99热这里只有精品| 手机免费av片| 黄一区二区三区| 8x8x成人免费视频| 国内精品久久久久影院色| 手机av在线网| 激情六月婷婷综合| 久久久久亚洲av无码网站| 国产乱码精品一区二区三区av | 国产夫妻自拍一区| 亚洲精品一二| 国产又大又硬又粗| 天堂va蜜桃一区二区三区| caoporn超碰97| 精品一区二区日韩| 成人一区二区三区仙踪林| 国产不卡免费视频| 亚洲成av人片在线观看无| 99久久99久久精品免费看蜜桃| 黄色av网址在线观看| 91一区在线观看| 日本精品在线观看视频| 国产精品久久久久久久久免费桃花| 亚洲一级理论片| 亚洲精品免费在线观看| 日本网站在线免费观看| 黑人巨大精品欧美一区二区| av首页在线观看| 欧美剧在线免费观看网站| 国内精品久久久久久久久久| 亚洲福利视频在线| 精品久久久久一区二区三区| 久久精品福利视频| 999福利在线视频| 日本sm极度另类视频| www一区二区三区| 精品产品国产在线不卡| 欧美亚洲高清| www.在线观看av| 久久先锋影音| wwwxxxx在线观看| 26uuu国产电影一区二区| 国产喷水在线观看| 欧美日韩美女视频| 国产剧情久久久| 日韩精品www| 黄色网在线看| 日本精品久久久久影院| 国产精久久一区二区| 久久人人97超碰人人澡爱香蕉| 色综合天天爱| 国产精品va无码一区二区| 精品写真视频在线观看| 丝袜美腿中文字幕| 亚洲精品免费看| 亚洲精品毛片一区二区三区| 欧美va亚洲va香蕉在线| av在线二区| 91国内免费在线视频| 亚洲精品aaa| 欧美午夜欧美| 在线观看的日韩av| 91网址在线观看精品| 欧美极品另类videosde| 国产视频91在线| 日韩美女一区二区三区| 69av在线| 国产精品吹潮在线观看| 99精品在免费线中文字幕网站一区 | 少妇无码av无码专区在线观看| 麻豆成人免费电影| 国产成人av一区二区三区不卡| 亚洲一区二区三区四区在线观看| 中文字字幕在线观看| 亚洲精品永久免费精品| sis001亚洲原创区| 444亚洲人体| 亚洲自拍偷拍网| 亚洲男人天堂av在线| 欧美国产一区二区| 精品成人无码久久久久久| 日韩激情视频在线| 91九色美女在线视频| 超碰97人人在线| 欧美大片一区| 青青草原播放器| 国产精品久久网站| 中国女人真人一级毛片| 亚洲欧美在线免费观看| 在线观看欧美日韩电影| 久久99精品久久久久久三级| 亚洲第一区色| 五十路六十路七十路熟婆| 亚洲成av人片一区二区三区| 精品人妻久久久久一区二区三区 | 亚洲国产高清福利视频| 暖暖在线中文免费日本| 高清视频在线观看一区| 狠狠爱综合网| 熟妇人妻久久中文字幕| 午夜视频一区二区| 日韩一区二区三区中文字幕| 欧美一级高清免费| 精品视频网站| 亚洲欧美自拍另类日韩| 中文字幕一区二区三区四区不卡 | 国产一级片91| 国产精品1区2区| 久久网中文字幕| 日韩第一页在线| 午夜精品成人av| 亚洲韩国在线| 韩国三级在线一区| 欧美人与禽zozzo禽性配| 精品国产3级a| 欧美黄色网页| 中国一区二区三区| 国产不卡视频一区| 麻豆成人免费视频| 国产亚洲精品成人av久久ww| 伊人久久一区| www.国产在线播放| 久久精品夜色噜噜亚洲aⅴ| 中文字幕一级片| 色综合天天狠天天透天天伊人 | 午夜精品亚洲一区二区三区嫩草| 精品亚洲成a人| 免费一级特黄特色大片| 亚洲毛片在线看| 日韩五码电影| 成人黄色大片网站| 国产日韩精品一区| h狠狠躁死你h高h| 热re91久久精品国99热蜜臀| 日韩精品欧美激情一区二区| 亚洲精品一二三四| 色综合久久综合中文综合网| 免费的黄网站在线观看| 国产亚洲精品美女久久久m| 日本午夜一本久久久综合| 欧美精品一区二区成人| 国产一区二区三区视频免费| 亚洲精品一区二区三区中文字幕| 亚洲精品中文字幕无码蜜桃| 亚洲免费三区一区二区| 日韩欧美在线番号| 91精品在线影院| 麻豆成人精品| 久草网视频在线观看| 亚洲午夜av久久乱码| 一区二区三区四区高清视频 | 亚洲天堂免费观看| 日韩精品视频在线看| 国产嫩草在线观看| 亚洲第一综合色| caopeng在线| 天堂av一区二区|