zoukankan      html  css  js  c++  java
  • Dapper扩展SQL跟踪及全局缓存通知-日志入队列

    接上一篇:

    记录Sql执行日志,主要处理  BeforeCommandExecute 方法

     1  /// <summary>
     2         /// 执行前事件跟踪信息
     3         /// </summary>
     4         /// <param name="traceInfo">跟踪信息</param>
     5         private static void BeforeCommandExecute(TraceInfo traceInfo)
     6         {
     7             if (null != CurrentEvent && CurrentEvent.IsCancel == false) //
     8             {
     9                  CurrentEvent.FireBeforeExecute(GetNewTraceItem(traceInfo, false, false));
    10             }
    11              
    12         }

    FireAfterExecute 这是一个订阅事件,它会把通过异步线程的试把消息提交到后台的队列,

    缓存队列目前支持四种实现方式 ,可自由切换,在当前的框架里已经实现了 ASPNET, Redis, RabbitMQ 三种方式的队列,

    默认采用的是Redis记录Sql,支持集中写入或单机写入模式,同时支持ASPNET单机写入模式(因为有的开发机器没有安装任何Redis, RabbitMQ, MongoDb之类的)

    一、缓存队列接口设计,采用双Key机制,主要是支持Redis hashKey模式。在每个线程类,可按需启动一个线程来定期调度或进行事件订阅,

    从缓存或队列中获取数据信息,再写入数据库或本地文件或通知 logstash来进行日志收集(下一步要做的)

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 using System.Threading.Tasks;
      6 using PlatForm;
      7 
      8 namespace PlatForm.Caches
      9 {
     10     /// <summary>
     11     /// 缓存与消息队列接口
     12     /// </summary>
     13     public interface ICacheAndQueue:IDisposable
     14     {
     15         /// <summary>
     16         /// 获取缓存数据
     17         /// </summary>
     18         /// <param name="groupKey">分组Key</param>
     19         /// <param name="key">缓存子Key</param>
     20         /// <param name="isUseLocalCache">为了提升性能,默认在30秒内使用本地缓存,不直接从Redis里提取,默认使用本地缓存</param>
     21      /// <param name="isRemoved">是否用完就清除</param>
     22         /// <returns></returns>
     23         List<EntityRow> GetCache(string groupKey, string key,bool isUseLocalCache=true,bool isRemoved=false);
     24 
     25     /// <summary>
     26     /// 设置缓存
     27     /// </summary>
     28     /// <param name="groupKey">缓存分组Key</param>
     29     /// <param name="key">子Key</param>
     30     /// <param name="data">数据</param>
     31         void SetCache(string groupKey, string key, List<EntityRow> data);
     32         /// <summary>
     33         /// 根据分组Key及子Key来进行删除缓存操作
     34         /// </summary>
     35         /// <param name="groupKey">分组Key</param>
     36         /// <param name="key">子Key</param>
     37         /// <returns></returns>
     38         bool RemoveCache(string groupKey, string key);
     39         /// <summary>
     40         /// 删除整个分组及其下性的缓存信息
     41         /// </summary>
     42         /// <param name="groupKey"></param>
     43         /// <returns></returns>
     44         bool RemoveCacheAll(string groupKey);
     45         Dictionary<string, int> GetCacheCount();
     46         /// <summary>
     47         /// 当前分组下的缓存是否存在
     48         /// </summary>
     49         /// <param name="goupKey">分组Key</param>
     50         /// <param name="key">缓存子Key</param>
     51         /// <returns></returns>
     52         bool IsExsit(string goupKey, string key);
     53         /// <summary>
     54         /// 返回当前缓存组的所有缓存
     55         /// </summary>
     56         /// <param name="groupKey"></param>
     57         /// <param name="isRemoveAll">返回数据后,是否立即汪空缓存,默认不为清空</param>
     58         /// <param name="isEntityRow">是否为实体行数据</param>
     59         /// <returns></returns>
     60         List<EntityRow> GetCacheAll(string groupKey, bool isRemoveAll = false, bool isEntityRow = true);
     61         /// <summary>
     62         /// 得到当前分组下的缓存数
     63         /// </summary>
     64         /// <param name="groupKey"></param>
     65         /// <returns></returns>
     66         int GetChildCount(string groupKey);
     67        /// <summary>
     68        /// 检测当前缓存是否正在正常运行
     69        /// </summary>
     70        /// <param name="message">返回信息</param>
     71        /// <returns></returns>
     72         bool CheckCacheRunning(out string message);
     73         long Publish(string channel, string message);
     74         void Subscribe(string channelKey, Action<string, string> callBack);
     75         /// <summary>
     76         /// 入队操作
     77         /// </summary>
     78         /// <param name="groupKey">分组Key</param>
     79         /// <param name="key">缓存子Key</param>
     80         /// <param name="data"></param>
     81         void EnqueenMessage(string groupKey, string key, EntityRow data);
     82         /// <summary>
     83         /// 出队操作
     84         /// </summary>
     85         /// <param name="groupKey">分组Key</param>
     86         /// <param name="key">缓存子Key</param>
     87         /// <param name="size">每次出队的个数</param>
     88         /// <returns></returns>
     89         List<EntityRow> DequeenMessages(string groupKey, string key, int size);
     90 
     91         /// <summary>
     92         /// 缓存队列类型
     93         /// </summary>
     94         CacheType CacheType { get; }
     95 
     96         /// <summary>
     97         /// 递增入队,用来统计点击量或访问量
     98         /// </summary>
     99         /// <param name="groupKey">分组Key</param>
    100         /// <param name="key">缓存子Key</param>
    101         /// <param name="value"></param>
    102         void HasIncrement(string groupKey, string key );
    103     }
    104 }

    二、缓存队列调用

    其它附加类

     1  /// <summary>
     2         /// 格式化输出跟踪信息
     3         /// </summary>
     4         /// <param name="traceInfo">跟踪信息</param>
     5         /// <param name="isEnd">是否结束</param>
     6         /// <param name="isError">是否发生错误</param>
     7         /// <returns></returns>
     8         private static TraceInfoItem GetNewTraceItem(TraceInfo traceInfo,bool isEnd,bool isError)
     9         {
    10             var parrams = traceInfo.SqlParams as DynamicParameters;
    11             if (null==parrams|| parrams.ParameterNames.Contains(Consts_DataTrace.DataCommandTraceID) == false)
    12                 return null;
    13             string traceid = parrams.Get<string>(Consts_DataTrace.DataCommandTraceID);
    14             string contentId = parrams.Get<string>(Consts_DataTrace.DataCommandTraceContextID);
    15             string message = parrams.Get<string>(Consts_DataTrace.DataCommandTraceMsg);
    16             if (isError)
    17             {
    18                 return new TraceInfoItem()
    19                 {
    20                     ID = traceid,
    21                     Token = traceid,
    22                     Body = FormatSql(traceInfo.CommandText, parrams),
    23                     EndTime = traceInfo.ExecuteTime,
    24                     Tag = message,
    25                     IsError = true,
    26                 };
    27             }
    28 
    29             if(isEnd)
    30             {
    31               return  new TraceInfoItem()
    32                 {
    33                     ID = traceid,
    34                     Token = traceid,
    35                     
    36                     EndTime = traceInfo.ExecuteTime,
    37                     Tag = message,
    38                     IsError = false,
    39 
    40                 };
    41 
    42             }
    43             return new TraceInfoItem()
    44             {
    45                 ID = traceid,
    46                 Token = traceid,
    47                 Body = FormatSql(traceInfo.CommandText, parrams),
    48                 StartTime = traceInfo.ExecuteTime,
    49                 Tag = message,
    50                 IsError = true,
    51 
    52             };
    53         }
  • 相关阅读:
    小故事
    设计模式
    git分支
    git简单操作
    ab命令压力测试
    libcheck ARM交叉编译
    libxml2 ARM 交叉编译
    I.MX6 安装LTIB
    为ARM编译Glib
    QT 4.8 中文显示问题
  • 原文地址:https://www.cnblogs.com/XSpots/p/7741584.html
Copyright © 2011-2022 走看看