接上一篇:
记录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 }