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         }
原文地址:https://www.cnblogs.com/XSpots/p/7741584.html