精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

翔田千里一区二区| 福利片一区二区| 亚洲欧洲日韩综合一区二区| 91传媒在线免费观看| 久久精品国产亚洲AV无码麻豆| 啪啪国产精品| 欧美精品777| 波多野结衣乳巨码无在线| 伊人免费在线| 不卡的av网站| 成人黄色av免费在线观看| 日韩少妇裸体做爰视频| 日韩成人精品一区| 亚洲黄色av女优在线观看| 性生活免费在线观看| 1区2区在线| 综合电影一区二区三区| 免费久久久一本精品久久区| 不卡视频在线播放| 青青青爽久久午夜综合久久午夜| 欧美激情在线观看视频| 亚洲色图27p| 经典一区二区| 亚洲精品720p| 免费黄视频在线观看| 成人国产精品入口免费视频| 精品成人av一区| 亚洲啊啊啊啊啊| 999在线视频| 久久久国产综合精品女国产盗摄| 国产精品久久国产精品| 五月天激情四射| 亚洲狼人精品一区二区三区| 美女性感视频久久久| 999福利视频| 欧美视频免费| 国产亚洲xxx| 青青草福利视频| 日韩av中文字幕一区| 欧美成人精品高清在线播放| 亚洲一区二区三区四区精品| 国产成人77亚洲精品www| 日韩欧美在线视频免费观看| 免费国产黄色网址| bl在线肉h视频大尺度| 亚洲黄色片在线观看| 黄色一级片av| 影音先锋男人资源在线| 亚洲精品一二三四区| 四虎永久免费网站| 久草免费在线观看| 亚洲天堂a在线| 18视频在线观看娇喘| 成人午夜在线影视| 国产精品国产自产拍在线| 视频一区二区三区在线观看 | 精品日韩99亚洲| 天天操精品视频| 欧美a级大片在线| 日韩一区二区三区四区五区六区| 色偷偷中文字幕| 欧美第一在线视频| 日韩免费高清视频| youjizz.com国产| 日韩av网站在线免费观看| 亚洲精品永久免费| 久久久久久成人网| 久久久久久久久久久妇女| 欧美巨猛xxxx猛交黑人97人| 国产午夜免费视频| 日韩视频一区| 欧美在线视频在线播放完整版免费观看| 中文字幕在线观看免费视频| 亚洲一区二区三区高清不卡| 国产精品18久久久久久首页狼| 欧美激情一区二区三区免费观看 | 天堂аⅴ在线地址8| 亚洲欧洲三级电影| 亚洲 欧美 综合 另类 中字| free性护士videos欧美| 一本高清dvd不卡在线观看| 黄色片视频在线| 视频在线一区| 亚洲欧美国产精品专区久久 | www.四虎在线| 最新国产精品视频| 日韩中文在线观看| 久久久久久久久久久网| 午夜亚洲激情| 91丨九色丨国产在线| 欧美一区,二区| 国产免费成人在线视频| 欧美亚洲色图视频| 免费高清视频在线一区| 精品国产91久久久久久久妲己| 播金莲一级淫片aaaaaaa| 日韩精品久久| 欧美一级视频一区二区| 国产一区二区自拍视频| 91年精品国产| ijzzijzzij亚洲大全| 涩涩涩视频在线观看| 91精品国产一区二区三区香蕉| 182在线视频| 亚洲高清影视| 国产精品h在线观看| 超碰福利在线观看| 中文字幕一区二区三区蜜月| 日韩免费视频播放| 国产麻豆精品| 中文字幕亚洲一区在线观看 | 国产精品久久久久久久av| 黄色在线一区| 成人亚洲激情网| 九色视频网站在线观看| 亚洲国产精品精华液网站| 久久综合伊人77777麻豆最新章节| 91精品国产乱码久久久竹菊| 日韩中文字幕在线观看| 国产熟妇一区二区三区四区| 成人午夜视频福利| 国产高清免费在线| 免费观看成人性生生活片| 日韩国产精品一区| 久久久久黄色片| 精品一区二区在线观看| 亚洲毛片aa| 日本精品裸体写真集在线观看| 日韩精品在线第一页| 九九热国产视频| 国产精品一区二区男女羞羞无遮挡| 亚洲欧洲精品一区二区三区波多野1战4| а√在线天堂官网| 精品国产乱子伦一区| 欧美激情国产精品免费| 国产老妇另类xxxxx| 在线成人av电影| 日韩成人一区| 日韩最新免费不卡| 91女人18毛片水多国产| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 性一交一乱一伧国产女士spa| 亚洲狼人综合| xxxxxxxxx欧美| 国产又色又爽又黄又免费| 国产精品久久久久一区二区三区共| avav在线看| 欧美人妖在线| 国产激情视频一区| 酒色婷婷桃色成人免费av网| 色欧美片视频在线观看| a天堂中文字幕| 奇米在线7777在线精品| 在线观看成人一级片| 欧美极品在线| 美女视频久久黄| 亚洲精品成人区在线观看| 亚洲一区二区三区视频在线播放 | 欧美国产乱子伦 | 国产精品456露脸| 日本高清视频免费在线观看| 视频成人永久免费视频| 97精品一区二区视频在线观看| 视频福利在线| 欧美午夜精品一区二区三区| 极品魔鬼身材女神啪啪精品| 国产成人免费视频精品含羞草妖精 | 色婷婷狠狠综合| 一级黄色录像毛片| 激情伊人五月天久久综合| 2022中文字幕| 神马香蕉久久| 国产精品美女999| www.在线视频| 亚洲精品成人av| 国产精品尤物视频| 亚洲精品视频免费看| 中国黄色片视频| 久久一区亚洲| 亚洲成人动漫在线| 麻豆成人入口| 国产精品一区二区三区在线播放| 影院在线观看全集免费观看| 亚洲欧美另类国产| 国产巨乳在线观看| 欧美性猛交丰臀xxxxx网站| 国产三级黄色片| 成人爱爱电影网址| 亚洲精品久久久中文字幕| 狠狠噜噜久久| 亚洲国产一区二区精品视频| 国产伦精品一区二区三区免费优势 | 欧美三级网色| 日韩成人视屏| 国产精品黄色影片导航在线观看| caoporm免费视频在线| 日韩国产精品视频| 国产成人免费看一级大黄| 日韩欧美aaa| 欧美高清视频一区二区三区| 久久久久国产免费免费| 欧美性猛交乱大交| 免费高清在线一区| 欧美日韩精品在线一区二区| 91亚洲一区| 玖玖玖精品中文字幕| 久久精品一级| 国产精品免费观看在线| av免费不卡| 久久精品国产91精品亚洲| 深夜福利视频在线免费观看| 日韩一区二区免费视频| 中文字幕日韩经典| 日韩欧美在线观看| 国产成人无码精品久在线观看| 《视频一区视频二区| xxxx日本免费| 成人av电影在线播放| 中文国产在线观看| 日本中文一区二区三区| 97超碰青青草| 在线欧美福利| 日韩极品视频在线观看| 91精品国产视频| 亚洲国产午夜伦理片大全在线观看网站| 欧美色图婷婷| 国产综合精品一区二区三区| 欧美a级大片在线| 91人人爽人人爽人人精88v| 国产精品久久乐| 国产精品mp4| 都市激情综合| 日本aⅴ大伊香蕉精品视频| 高端美女服务在线视频播放| 欧美大片免费观看| 在线观看中文| 欧美日韩不卡合集视频| a级网站在线播放| 另类色图亚洲色图| 国产激情在线视频| 欧美精品日韩www.p站| 在线播放免费av| 欧美精品久久久久久久久| 影音先锋在线视频| 久久久久久国产精品三级玉女聊斋| 在线不卡日本v二区707| 欧美激情高清视频| а_天堂中文在线| 国外成人性视频| 日本在线影院| 日本欧美中文字幕| 99亚洲伊人久久精品影院| 国产精品亚洲аv天堂网| 欧美高清xxx| 99re在线视频上| 国产精品18hdxxxⅹ在线| 精品国产乱码久久久久软件| 欧美调教在线| 日韩欧美三级一区二区| 成人影院在线| 黄色网zhan| 在线播放不卡| 免费看a级黄色片| 久久99精品久久久久| 久久久精品视频国产| 国产91富婆露脸刺激对白| 中文字幕 亚洲一区| 久久精品一级爱片| 波多野结衣在线网址| 亚洲一区二区影院| wwwwww国产| 精品视频1区2区| 午夜精品在线播放| 国产视频久久网| 免费在线午夜视频| 久久久久久久久国产| 最新欧美色图| 成人国产精品久久久| 国产精品久av福利在线观看| 茄子视频成人在线观看| 99久久久久| 色综合久久久久无码专区| 免费成人美女在线观看.| 女人扒开腿免费视频app| 26uuu色噜噜精品一区| 亚洲 欧美 变态 另类 综合| 亚洲成人免费视| 在线观看免费视频一区| 亚洲成av人乱码色午夜| 久久这里精品| 欧美激情视频一区二区| 国产成人精品亚洲日本在线观看| 91成人理论电影| av一区二区高清| 国产精品一线二线三线| 蜜臀精品一区二区三区在线观看| 日韩精品xxx| 国产精品三级电影| 亚洲国产精品午夜在线观看| 在线观看91精品国产麻豆| 免费观看a视频| 久久精品国产2020观看福利| 日本久久免费| 国产一区二区在线观看免费播放| 日韩精品水蜜桃| 亚洲国产精品久久久久爰色欲| 国产精品一区二区三区网站| 日韩免费成人av| 色综合久久综合网97色综合| 蜜桃av噜噜一区二区三区麻豆| 久久精品国产亚洲| 亚洲成av在线| 九9re精品视频在线观看re6| 欧美日韩国产综合网| 日韩中文字幕a| 国产亚洲精品久| 在线观看日韩中文字幕| 精品国产91乱码一区二区三区 | 欧美国产专区| jizz欧美性11| 国产色综合久久| 4438国产精品一区二区| 亚洲福利视频网| 在线中文字幕-区二区三区四区| 国产免费一区二区三区香蕉精| 中文有码一区| 国产高清精品在线观看| 成人av手机在线观看| 久草免费新视频| 日韩视频免费观看高清在线视频| 成视频免费观看在线看| 国产精品偷伦视频免费观看国产 | 欧美另类第一页| 国产欧美88| 一道本在线观看视频| 精品一区二区三区免费观看| 成人无码精品1区2区3区免费看| 日本韩国一区二区三区| 欧美xxx.com| 欧洲日本亚洲国产区| 婷婷亚洲成人| 久久精品99国产| 久久精品夜色噜噜亚洲aⅴ| 日本一本在线观看| 亚洲最新av在线| 国产精品久久久久久吹潮| 色综合久久久久久久久五月| 日韩av成人高清| 美女av免费看| 欧美精品tushy高清| 亚洲图区一区| 好看的日韩精品视频在线| 999在线观看精品免费不卡网站| 亚洲图片综合网| 日本精品一级二级| 91ph在线| 99国产视频| 亚洲黄色大片| 在线国产视频一区| 欧美视频你懂的| 成人在线视频亚洲| 国产精品亚洲一区| 免费在线亚洲欧美| 中文字幕av久久爽一区| 7777精品久久久大香线蕉| 日本三级韩国三级欧美三级| 久久人人九九| 日本视频一区二区| 亚洲av鲁丝一区二区三区| 亚洲成人久久一区| 国产成人精品亚洲日本在线观看| 中文字幕黄色大片| 成熟亚洲日本毛茸茸凸凹| 亚洲永久精品在线观看| 色噜噜国产精品视频一区二区| 欧美黄视频在线观看| 国产成人在线免费看| 中文字幕在线不卡一区二区三区| 亚洲成人中文字幕在线| 日本精品免费观看| 一本一道久久a久久精品蜜桃 | 亚洲国产精品二十页| 国产欧美熟妇另类久久久| 午夜精品久久久久久久99热浪潮 | 91麻豆国产在线观看| 亚洲怡红院av| 午夜剧场成人观在线视频免费观看| 国产精品羞羞答答在线观看| 性一交一黄一片| 欧洲激情一区二区| 黄色大片在线| 一区二区精品国产| av电影一区二区| av一区二区三| 国产精品1234| 日韩视频久久| 午夜写真片福利电影网| 国产午夜精品全部视频在线播放 | 精品亚洲永久免费精品| 国产精品白丝久久av网站|