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

C#開發高性能Log Help類設計開發

開發 后端
項目中要在操作數據庫的異常處理中加入寫Log日志,對于商業上有要求,寫log時對其它操作盡可能影響小,不能因為加入log導致耗時太多。在寫入日志時利用Queue來管理,寫日志有一個專門的backgroud線程來處理,如果沒有日志要寫,這個線程處于wait狀態,這就有了線程的異步處理。

概述

項目中要在操作數據庫的異常處理中加入寫Log日志,對于商業上有要求,寫log時對其它操作盡可能影響小,不能因為加入log導致耗時太多。

設計思想

在寫入日志時利用Queue來管理,寫日志有一個專門的backgroud線程來處理,如果沒有日志要寫,這個線程處于wait狀態,這就有了線程的異步處理。

簡單的實現方式

  1. //<summary>  
  2. //Write Log  
  3. //<summary>  
  4. public static void WriteLog(string logFile, string msg)  
  5. {  
  6.     try 
  7.     {  
  8.         System.IO.StreamWriter sw = System.IO.File.AppendText(  
  9.                 logPath + LogFilePrefix +" "+ logFile + " " +  
  10.                 DateTime.Now.ToString("yyyyMMdd") + ".Log" 
  11.             );  
  12.         sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:  ") + msg);  
  13.         sw.Close();  
  14.     }  
  15.     catch (Exception)  
  16.     {  
  17.            
  18.         throw;  
  19.     }  

我們的設計圖

image 

而后我們在AddLogMessage時semaphore.Release()就能喚醒wait中的log 線程。

代碼設計

  1. /// <summary>  
  2. /// Author: spring yang  
  3. /// Create time:2012/3/30  
  4. /// Log Help class  
  5. /// </summary>  
  6. /// <remarks>High performance log class</remarks>  
  7. public class Log : IDisposable  
  8. {  
  9.     //Log Message queue  
  10.     private static Queue<LogMessage> _logMessages;  
  11.  
  12.     //log save directory  
  13.     private static string _logDirectory;  
  14.  
  15.     //log write file state  
  16.     private static bool _state;  
  17.  
  18.     //log type  
  19.     private static LogType _logType;  
  20.  
  21.     //log life time sign  
  22.     private static DateTime _timeSign;  
  23.  
  24.     //log file stream writer  
  25.     private static StreamWriter _writer;  
  26.  
  27.     /// <summary>  
  28.     /// Wait enqueue wirte log message semaphore will release  
  29.     /// </summary>  
  30.     private Semaphore _semaphore;  
  31.  
  32.     /// <summary>  
  33.     /// Single instance  
  34.     /// </summary>  
  35.     private static Log _log;  
  36.  
  37.     /// <summary>  
  38.     /// Gets a single instance  
  39.     /// </summary>  
  40.     public static Log LogInstance  
  41.     {  
  42.         get { return _log ?? (_log = new Log()); }  
  43.     }  
  44.  
  45.     private object _lockObjeck;  
  46.  
  47.     /// <summary>  
  48.     /// Initialize Log instance  
  49.     /// </summary>  
  50.     private void Initialize()  
  51.     {  
  52.         if (_logMessages == null)  
  53.         {   _state = true;  
  54.             string logPath = System.Configuration.ConfigurationManager.AppSettings["LogDirectory"];  
  55.             _logDirectory = string.IsNullOrEmpty(logPath) ? ".\\log\\" : logPath;  
  56.             if (!Directory.Exists(_logDirectory)) Directory.CreateDirectory(_logDirectory);  
  57.             _logType = LogType.Daily;  
  58.             _lockObjeck=new object();  
  59.             _semaphore = new Semaphore(0, int.MaxValue, Constants.LogSemaphoreName);  
  60.             _logMessages = new Queue<LogMessage>();  
  61.             var thread = new Thread(Work) {IsBackground = true};  
  62.             thread.Start();  
  63.         }  
  64.     }  
  65.  
  66.     /// <summary>  
  67.     /// Create a log instance  
  68.     /// </summary>  
  69.     private Log()  
  70.     {  
  71.         Initialize();  
  72.     }  
  73.  
  74.     /// <summary>  
  75.     /// Log save name type,default is daily  
  76.     /// </summary>  
  77.     public LogType LogType  
  78.     {  
  79.         get { return _logType; }  
  80.         set { _logType = value; }  
  81.     }  
  82.  
  83.     /// <summary>  
  84.     /// Write Log file  work method  
  85.     /// </summary>  
  86.     private void Work()  
  87.     {  
  88.         while (true)  
  89.         {  
  90.             //Determine log queue have record need wirte  
  91.             if (_logMessages.Count > 0)  
  92.             {  
  93.                 FileWriteMessage();  
  94.             }  
  95.             else 
  96.                 if (WaitLogMessage()) break;  
  97.         }  
  98.     }  
  99.  
  100.     /// <summary>  
  101.     /// Write message to log file  
  102.     /// </summary>  
  103.     private void FileWriteMessage()  
  104.     {  
  105.         LogMessage logMessage=null;  
  106.         lock (_lockObjeck)  
  107.         {  
  108.             if(_logMessages.Count>0)  
  109.             logMessage = _logMessages.Dequeue();  
  110.         }  
  111.         if (logMessage != null)  
  112.         {  
  113.             FileWrite(logMessage);  
  114.         }  
  115.     }  
  116.  
  117.     /// <summary>  
  118.     /// The thread wait a log message  
  119.     /// </summary>  
  120.     /// <returns>is close or not</returns>  
  121.     private bool WaitLogMessage()  
  122.     {  
  123.         //determine log life time is true or false  
  124.         if (_state)  
  125.         {  
  126.             WaitHandle.WaitAny(new WaitHandle[] { _semaphore }, -1, false);  
  127.             return false;  
  128.         }  
  129.         FileClose();  
  130.         return true;  
  131.     }  
  132.  
  133.     /// <summary>  
  134.     /// Gets file name by log type  
  135.     /// </summary>  
  136.     /// <returns>log file name</returns>  
  137.     private string GetFilename()  
  138.     {  
  139.         DateTime now = DateTime.Now;  
  140.         string format = "";  
  141.         switch (_logType)  
  142.         {  
  143.             case LogType.Daily:  
  144.                 _timeSign = new DateTime(now.Year, now.Month, now.Day);  
  145.                 _timeSign = _timeSign.AddDays(1);  
  146.                 format = "yyyyMMdd'.log'";  
  147.                 break;  
  148.             case LogType.Weekly:  
  149.                 _timeSign = new DateTime(now.Year, now.Month, now.Day);  
  150.                 _timeSign = _timeSign.AddDays(7);  
  151.                 format = "yyyyMMdd'.log'";  
  152.                 break;  
  153.             case LogType.Monthly:  
  154.                 _timeSign = new DateTime(now.Year, now.Month, 1);  
  155.                 _timeSign = _timeSign.AddMonths(1);  
  156.                 format = "yyyyMM'.log'";  
  157.                 break;  
  158.             case LogType.Annually:  
  159.                 _timeSign = new DateTime(now.Year, 1, 1);  
  160.                 _timeSign = _timeSign.AddYears(1);  
  161.                 format = "yyyy'.log'";  
  162.                 break;  
  163.         }  
  164.         return now.ToString(format);  
  165.     }  
  166.  
  167.     /// <summary>  
  168.     /// Write log file message  
  169.     /// </summary>  
  170.     /// <param name="msg"></param>  
  171.     private void FileWrite(LogMessage msg)  
  172.     {  
  173.         try 
  174.         {  
  175.             if (_writer == null)  
  176.             {  
  177.                 FileOpen();  
  178.             }  
  179.             else 
  180.             {  
  181.                 //determine the log file is time sign  
  182.                 if (DateTime.Now >= _timeSign)  
  183.                 {  
  184.                     FileClose();  
  185.                     FileOpen();  
  186.                 }  
  187.                 _writer.WriteLine(Constants.LogMessageTime+msg.Datetime);  
  188.                 _writer.WriteLine(Constants.LogMessageType+msg.Type);  
  189.                 _writer.WriteLine(Constants.LogMessageContent+msg.Text);  
  190.                 _writer.Flush();  
  191.             }  
  192.         }  
  193.         catch (Exception e)  
  194.         {  
  195.             Console.Out.Write(e);  
  196.         }  
  197.     }  
  198.  
  199.     /// <summary>  
  200.     /// Open log file write log message  
  201.     /// </summary>  
  202.     private void FileOpen()  
  203.     {  
  204.         _writer = new StreamWriter(Path.Combine(_logDirectory, GetFilename()), true, Encoding.UTF8);  
  205.     }  
  206.  
  207.     /// <summary>  
  208.     /// Close log file  
  209.     /// </summary>  
  210.     private void FileClose()  
  211.     {  
  212.         if (_writer != null)  
  213.         {  
  214.             _writer.Flush();  
  215.             _writer.Close();  
  216.             _writer.Dispose();  
  217.             _writer = null;  
  218.         }  
  219.     }  
  220.  
  221.     /// <summary>  
  222.     /// Enqueue a new log message and release a semaphore  
  223.     /// </summary>  
  224.     /// <param name="msg">Log message</param>  
  225.     public void Write(LogMessage msg)  
  226.     {  
  227.         if (msg != null)  
  228.         {  
  229.             lock (_lockObjeck)  
  230.             {  
  231.                 _logMessages.Enqueue(msg);  
  232.                 _semaphore.Release();  
  233.             }  
  234.         }  
  235.     }  
  236.  
  237.     /// <summary>  
  238.     /// Write message by message content and type  
  239.     /// </summary>  
  240.     /// <param name="text">log message</param>  
  241.     /// <param name="type">message type</param>  
  242.     public void Write(string text, MessageType type)  
  243.     {  
  244.         Write(new LogMessage(text, type));  
  245.     }  
  246.  
  247.     /// <summary>  
  248.     /// Write Message by datetime and message content and type  
  249.     /// </summary>  
  250.     /// <param name="dateTime">datetime</param>  
  251.     /// <param name="text">message content</param>  
  252.     /// <param name="type">message type</param>  
  253.     public void Write(DateTime dateTime, string text, MessageType type)  
  254.     {  
  255.         Write(new LogMessage(dateTime, text, type));  
  256.     }  
  257.  
  258.     /// <summary>  
  259.     /// Write message ty exception and message type  
  260.     /// </summary>  
  261.     /// <param name="e">exception</param>  
  262.     /// <param name="type">message type</param>  
  263.     public void Write(Exception e, MessageType type)  
  264.     {  
  265.         Write(new LogMessage(e.Message, type));  
  266.     }  
  267.  
  268.     #region IDisposable member  
  269.  
  270.     /// <summary>  
  271.     /// Dispose log  
  272.     /// </summary>  
  273.     public void Dispose()  
  274.     {  
  275.         _state = false;  
  276.     }  
  277.  
  278.     #endregion  
  279. }  
  280.  
  281. /// <summary>  
  282. /// Log Type  
  283. /// </summary>  
  284. /// <remarks>Create log by daily or weekly or monthly or annually</remarks>  
  285. public enum LogType  
  286. {  
  287.     /// <summary>  
  288.     /// Create log by daily  
  289.     /// </summary>  
  290.     Daily,  
  291.  
  292.     /// <summary>  
  293.     /// Create log by weekly  
  294.     /// </summary>  
  295.     Weekly,  
  296.  
  297.     /// <summary>  
  298.     /// Create log by monthly  
  299.     /// </summary>  
  300.     Monthly,  
  301.  
  302.     /// <summary>  
  303.     /// Create log by annually  
  304.     /// </summary>  
  305.     Annually  
  306. }  
  307.  
  308. /// <summary>  
  309. /// Log Message Class  
  310. /// </summary>  
  311. public class LogMessage  
  312. {  
  313.  
  314.     /// <summary>  
  315.     /// Create Log message instance  
  316.     /// </summary>  
  317.     public LogMessage()  
  318.         : this("", MessageType.Unknown)  
  319.     {  
  320.     }  
  321.  
  322.     /// <summary>  
  323.     /// Crete log message by message content and message type  
  324.     /// </summary>  
  325.     /// <param name="text">message content</param>  
  326.     /// <param name="messageType">message type</param>  
  327.     public LogMessage(string text, MessageType messageType)  
  328.         : this(DateTime.Now, text, messageType)  
  329.     {  
  330.     }  
  331.  
  332.     /// <summary>  
  333.     /// Create log message by datetime and message content and message type  
  334.     /// </summary>  
  335.     /// <param name="dateTime">date time </param>  
  336.     /// <param name="text">message content</param>  
  337.     /// <param name="messageType">message type</param>  
  338.     public LogMessage(DateTime dateTime, string text, MessageType messageType)  
  339.     {  
  340.         Datetime = dateTime;  
  341.         Type = messageType;  
  342.         Text = text;  
  343.     }  
  344.  
  345.     /// <summary>  
  346.     /// Gets or sets datetime  
  347.     /// </summary>  
  348.     public DateTime Datetime { getset; }  
  349.  
  350.     /// <summary>  
  351.     /// Gets or sets message content  
  352.     /// </summary>  
  353.     public string Text { getset; }  
  354.  
  355.     /// <summary>  
  356.     /// Gets or sets message type  
  357.     /// </summary>  
  358.     public MessageType Type { getset; }  
  359.  
  360.     /// <summary>  
  361.     /// Get Message to string  
  362.     /// </summary>  
  363.     /// <returns></returns>  
  364.     public new string ToString()  
  365.     {  
  366.         return Datetime.ToString(CultureInfo.InvariantCulture) + "\t" + Text + "\n";  
  367.     }  
  368. }  
  369.  
  370. /// <summary>  
  371. /// Log Message Type enum  
  372. /// </summary>  
  373. public enum MessageType  
  374. {  
  375.     /// <summary>  
  376.     /// unknown type  
  377.     /// </summary>  
  378.     Unknown,  
  379.  
  380.     /// <summary>  
  381.     /// information type  
  382.     /// </summary>  
  383.     Information,  
  384.  
  385.     /// <summary>  
  386.     /// warning type  
  387.     /// </summary>  
  388.     Warning,  
  389.  
  390.     /// <summary>  
  391.     /// error type  
  392.     /// </summary>  
  393.     Error,  
  394.  
  395.     /// <summary>  
  396.     /// success type  
  397.     /// </summary>  
  398.     Success  
  399. }  

Test Case:

  1. public static void TestLog()  
  2. {  
  3.     Log.LogInstance.Write(  "Test Message",MessageType.Information);  
  4.     Log.LogInstance.Write("one",MessageType.Error);  
  5.     Log.LogInstance.Write("two", MessageType.Success);  
  6.     Log.LogInstance.Write("three", MessageType.Warning);  

運行結果:

image

接受Mainz的建議,改了部分代碼。

Mainz:http://www.cnblogs.com/Mainz/

原文鏈接:http://www.cnblogs.com/springyangwc/archive/2012/03/30/2425822.html

【編輯推薦】

  1. C#幾個經常犯錯誤匯總
  2. 淺談面向對象程序設計C#中的類
  3. 詳解C#中不同類的類型
  4. 淺談C#中標準Dispose模式的實現
  5. C#選擇正確的集合進行編碼
責任編輯:林師授 來源: spring yang的博客
相關推薦

2013-09-10 16:16:19

移動網站性能優化移動web

2011-06-14 09:27:43

高性能WEB開發

2009-09-07 06:18:57

C#窗體設計器

2011-04-18 10:16:30

WEB高性能

2009-02-27 14:46:09

AjaxGWT開發

2009-08-20 09:30:03

C#開發WinForm

2009-08-20 10:24:52

C#開發WinForm

2009-08-27 16:54:59

C#開發技巧

2013-06-17 15:41:09

Windows PhoWP開發JSON生成C#類

2019-01-02 16:47:46

Golang彈幕

2019-01-02 16:38:37

Golang彈幕

2011-04-19 11:06:03

JavaScriptweb

2010-04-15 16:50:58

Oracle動態SQL

2011-10-18 13:58:32

高性能web

2019-01-02 16:50:30

Golang彈幕

2009-08-24 10:10:09

C#復合控件

2009-08-24 09:55:24

C#集成開發環境

2024-08-13 14:14:55

場景數據庫API

2011-04-07 13:53:25

Web工具

2020-07-16 08:06:53

網關高性能
點贊
收藏

51CTO技術棧公眾號

欧美一区二区私人影院日本| 国产精品美女久久久久久久久久久| 久久国产精品免费视频| 韩国一区二区三区四区| 欧美videossex另类| 欧美中文高清| 久久久99精品免费观看| 国产精品久久久久久久久久新婚| 看免费黄色录像| 综合另类专区| 国产精品久久久久一区| av成人观看| 日本女人性生活视频| 中文字幕在线直播| 国产精品污网站| 日韩美女中文字幕| 一区二区三区四区五区| 亚欧日韩另类中文欧美| 在线播放国产精品二区一二区四区| 国产夫妻自拍一区| yw193.com尤物在线| 国产91富婆露脸刺激对白| 国产91精品最新在线播放| 极品盗摄国产盗摄合集| 啪啪亚洲精品| 欧美精品一区二| 中文字幕资源在线观看| 亚洲成人三级| av影院午夜一区| 成人激情视频免费在线| 日本特级黄色片| 午夜精品久久久久99热蜜桃导演| 影音先锋日韩有码| 精品无码国产一区二区三区51安| 亚洲综合伊人| 在线视频欧美区| 日韩高清av| 六月丁香色婷婷| 国产精品综合在线视频| 国产精品天天狠天天看| 国产无套丰满白嫩对白| 精品成人久久| 欧美丰满少妇xxxxx做受| 一级在线观看视频| 久久不见久久见免费视频7| 精品久久久久久久人人人人传媒 | 国产成人亚洲欧美| 国产精品无码免费播放 | 日本高清不卡在线| 国产黄色片视频| 精品91在线| 欧美激情成人在线视频| 免费无码毛片一区二区app| 亚洲精品国产成人影院| 日韩亚洲欧美一区| 911福利视频| 国产区美女在线| 亚洲欧美一区二区三区国产精品| 亚洲一区二区在线免费观看| 99在线精品视频免费观看20| 蜜桃av一区二区三区电影| 国产精品91一区| 日韩精品一区二区亚洲av观看| 国产农村妇女精品一区二区| 2020国产精品视频| 制服.丝袜.亚洲.中文.综合懂色| 国产一区二区三区久久| 2019中文字幕免费视频| 国产又大又黄又粗| 日韩在线卡一卡二| 精品国产一区二区三区四区在线观看 | 欧美一区二区三区在线免费观看| 欧美成人片在线| 国产午夜亚洲精品羞羞网站| 日韩av一区二区三区在线| 国产福利片在线| 国产精品福利一区| 男女啪啪免费观看| 国产美女福利在线观看| 精品女厕一区二区三区| 麻豆传传媒久久久爱| 成人在线中文| 欧美一级欧美三级| 国产人妻黑人一区二区三区| 妖精视频一区二区三区| 中文字幕在线亚洲| 极品魔鬼身材女神啪啪精品| 一区久久精品| 国产大片精品免费永久看nba| 中文字幕欧美在线观看| 亚洲午夜91| 97视频在线看| 波多野结衣一本一道| 精品亚洲aⅴ乱码一区二区三区| 88国产精品欧美一区二区三区| 国产精品久久久久久99| 免费日本视频一区| 国产91精品入口17c| 精品视频二区| 亚洲九九爱视频| 国产亚洲欧美在线视频| 日本大片在线播放| 日韩欧美中文字幕在线播放| 女人高潮一级片| 美女午夜精品| 久久好看免费视频| 天天操天天干视频| 激情小说亚洲一区| 狼狼综合久久久久综合网| 国产在线二区| 色婷婷国产精品久久包臀| 性久久久久久久久久久久久久| 免费成人蒂法| 亚洲精品久久久久中文字幕二区 | 精品国产黄色片| 91麻豆.com| 青青在线免费视频| 成人va天堂| 精品免费视频一区二区| 成人一级片免费看| 亚洲免费网站| 成人黄视频免费| 香蕉视频在线看| 日韩欧美成人精品| 中国免费黄色片| 午夜久久免费观看| 国产精品久久久久久久久久久久久 | 亚洲色图38p| 91综合精品国产丝袜长腿久久| 这里只有精品丝袜| www毛片com| 成a人片国产精品| 成年丰满熟妇午夜免费视频| 精品美女一区| 国产性色av一区二区| 国产精品7777777| 国产suv精品一区二区三区| 亚洲一区3d动漫同人无遮挡| 午夜欧美巨大性欧美巨大| 亚洲国产日韩欧美在线动漫| www.av视频| 国产乱色国产精品免费视频| 一区二区三区的久久的视频| 欧美××××黑人××性爽| 亚洲精品一区在线观看香蕉| 免费在线观看黄网站| 成人精品高清在线| av在线com| 国内精品国产成人国产三级粉色| 欧美黄色小视频| 亚洲xxx在线| 亚洲综合男人的天堂| 国产黑丝在线视频| 欧美freesex交免费视频| 亚洲伊人成综合成人网| jizz性欧美10| 精品国产一区a| 国产精品第二十页| 久久午夜精品一区二区| 久久国产精品 国产精品| 日本乱码一区二区三区不卡| 亚洲美女av电影| 久久久久久无码精品大片| 国产欧美一区二区精品性色 | 亚洲老板91色精品久久| 精品人妻一区二区色欲产成人| 久久综合五月天婷婷伊人| 亚洲va韩国va欧美va精四季| 中文在线8资源库| 亚洲区一区二区| 一道本在线视频| 亚洲视频一区在线| 中文字幕无人区二| 日韩一级在线| 日韩国产精品一区二区三区| 久久69成人| 九九精品在线视频| 五月婷中文字幕| 色偷偷一区二区三区| 亚洲天堂精品一区| 国产福利视频一区二区三区| 久久久久久免费看| 精品一区二区三区在线| 91精品国产综合久久香蕉最新版 | 青春草视频在线观看| 亚洲精品720p| 亚洲av人无码激艳猛片服务器| 中文字幕亚洲不卡| 亚洲天堂资源在线| 麻豆精品视频在线观看免费| 欧美日韩dvd| 色综合综合网| 91中文精品字幕在线视频| 美女扒开腿让男人桶爽久久软| 在线观看免费高清视频97| 国产又大又黑又粗| 欧美日韩精品在线| 国产精品麻豆免费版现看视频| 懂色av一区二区三区免费观看| 黄色免费视频大全| 我不卡神马影院| 久久亚洲精品欧美| 激情视频亚洲| 国产成人精品久久二区二区91| 黄色大片在线播放| 亚洲欧美中文字幕在线一区| 99国产精品久久久久99打野战| 欧美午夜女人视频在线| 91麻豆免费视频网站| 国产亚洲综合av| 中文字幕在线观看91| 青草av.久久免费一区| 黄网站欧美内射| 999精品在线| 欧美一进一出视频| 国产91精品入| 91色中文字幕| 成人在线网站| 欧美一乱一性一交一视频| 51xtv成人影院| 日韩一区av在线| 青青久草在线| 亚洲激情久久久| 亚洲第一视频在线播放| 欧美色爱综合网| 亚洲区一区二区三| 久久久亚洲午夜电影| 中文字幕人妻一区| 黑人巨大精品欧美黑白配亚洲| 凹凸日日摸日日碰夜夜爽1| 亚洲成人在线| 91网站在线观看免费| 欧美1级片网站| 色噜噜狠狠色综合网| 亚洲精品蜜桃乱晃| 国产一区二区三区四区五区加勒比 | 欧美午夜不卡影院在线观看完整版免费| 日韩电影天堂视频一区二区| 日韩动漫一区| 国内精品视频免费| 国产伦精品一区二区三区在线播放| 91在线高清免费观看| 亚洲成人高清| 成人黄色免费网站在线观看| 99riav视频一区二区| 国产精品九九久久久久久久| 国精产品一区一区三区四川| 国产成人福利视频| 天天综合网站| 国产精品91视频| 国产黄色一区| 国产日韩中文字幕| 香蕉成人在线| 亚洲va国产va天堂va久久| 国产激情精品一区二区三区| 国产欧美一区二区三区四区| 免费成人黄色网| 91亚洲国产成人久久精品网站| 五月天色综合| 成人免费视频网站入口| 第四色在线一区二区| 国产伦精品一区二区三区免| 久久狠狠久久| 欧美成人免费在线| 欧美日韩激情| 樱花www成人免费视频| 99久久这里只有精品| 青青草影院在线观看| 欧美久久一区| 男女激情无遮挡| 日韩精品一二三四| 中文字幕资源在线观看| 成人深夜视频在线观看| 国产精品无码永久免费不卡| 国产午夜一区二区三区| 在线看的片片片免费| 精品国产鲁一鲁一区二区张丽| 波多野结衣啪啪| 欧美久久一二区| 圆产精品久久久久久久久久久| 天天综合网 天天综合色| 中文字幕亚洲乱码熟女1区2区| 欧美性一区二区| 国产www免费观看| 亚洲黄页视频免费观看| av男人的天堂在线| 欧美国产日韩xxxxx| 345成人影院| 91免费看片网站| 色婷婷综合久久久久久| 在线免费一区| 亚洲视频www| 精品999在线| 成人av在线观| 日韩av片在线免费观看| 亚洲综合久久久| 中文字幕在线观看免费| 亚洲成人精品视频| 在线免费看黄| 7777精品视频| 国产精品va视频| 欧美一区二区三区四区五区六区| 性欧美69xoxoxoxo| 无码人妻丰满熟妇区毛片| 国产美女在线精品| 在线小视频你懂的| 亚洲午夜电影在线观看| 久草视频在线资源| 欧美亚洲国产一区二区三区va | 亚洲精品一区中文字幕乱码| 免费av在线播放| 俺去亚洲欧洲欧美日韩| 男人av在线播放| 91中文字幕在线观看| 精品久久久亚洲| 少妇高潮毛片色欲ava片| 激情久久久久久久久久久久久久久久| 懂色av粉嫩av蜜乳av| 亚洲欧美日韩精品久久久久| 精品国产午夜福利| 亚洲国产精品yw在线观看| 成人免费在线| 国产日本欧美视频| 精品久久电影| 69堂免费视频| 成人va在线观看| 欧美三级 欧美一级| 欧美浪妇xxxx高跟鞋交| h网站在线免费观看| 日韩av大片免费看| 香蕉久久99| 黄www在线观看| 99久久夜色精品国产网站| 免费一级黄色大片| 91精品国产一区二区| 欧美尤物美女在线| 国产日本欧美视频| 久久美女精品| 污网站免费在线| 亚洲国产精品t66y| 成年人晚上看的视频| 亚洲色图在线观看| 久久uomeier| 免费成人深夜夜行视频| 乱人伦精品视频在线观看| 黄色短视频在线观看| 欧美日韩国产一区二区| 天堂在线一二区| 久久精品精品电影网| 九七影院97影院理论片久久 | 成人女保姆的销魂服务| 久久蜜桃av| 午夜福利123| 亚洲美女区一区| 成人久久久精品国产乱码一区二区 | 久久日免费视频| 欧美揉bbbbb揉bbbbb| 9191在线| 亚洲尤物视频网| 亚洲私拍自拍| 亚洲蜜桃精久久久久久久久久久久| 欧美午夜视频在线观看| 六十路在线观看| 国产精品亚洲аv天堂网| 999成人网| 亚洲午夜久久久久久久久| 午夜电影网一区| 国产在线观看网站| 国产免费观看久久黄| 亚洲视频电影在线| 亚洲美女高潮久久久| 欧美日韩国产中文字幕| 成人动漫在线免费观看| 国产欧美精品一区二区三区介绍| 一本一本久久a久久综合精品| 免费啪视频在线观看| 一本一本大道香蕉久在线精品 | 超级砰砰砰97免费观看最新一期| 一区二区三区影院| 深夜福利在线视频| 国产精品一久久香蕉国产线看观看| 亚洲天堂免费| 欧美高清性xxxx| 欧美美女一区二区三区| 欧美videosex性极品hd| 欧美在线视频二区| 韩国欧美国产1区| 日本va欧美va国产激情| 日韩一区二区三区xxxx| 国产精品主播在线观看| 黄色av免费在线播放| 亚洲精品高清在线| 毛片网站在线观看| 亚洲专区国产精品| 久久在线精品| 欧美日韩国产精品一区二区三区| 日韩电影中文 亚洲精品乱码| 久久久久黄色| 18禁免费无码无遮挡不卡网站| 国产精品国产精品国产专区不蜜 |