HSLLogNet

学习自 HslCommunication.LogNet.LogNetBase

结构拆分

构造函数

  1. 实例化文件存储锁
  2. 简单锁
  3. 队列类型为文件记录信息

私有字段

  1. int类型保存状态 m_SaveStatus
  2. 锁声明:文件存储锁、简单锁

事件处理

  1. 文件存储前触发的事件

日志存储模式

  1. 单文件;
  2. 按大小存储;
  3. 按时间存储;

日志记录函数

WriteDebug(string text)
WriteDebug(string keyWord,string text)

核心都为:RecordMessage( HslMessageDegree.DEBUG, keyword,text);

RecordMessage-->WriteToFile-->AddItemToCache-->StartSaveFile-->ThreadPoolSaveFile;

WriteToFile

等级判断,写文件

  1. 首先进行等级判断,高于设定等级才会进行写操作
  2. 满足1,首先根据等级、keyword、text封装记录数据体-HslMessageItem
  3. 之后调用 AddItemCache,将记录数据传入;

AddItemCache

作用:将记录数据添加进队列 Queue,之后进行文件日志的记录

  1. 开启锁;
  2. 将数据记录添加进队列 Queue;
  3. 释放锁;
  4. 开始记录文件 StartSaveFile
StartSaveFile



  1. 开启原子操作,交换 m_SaveStatus 值,更改成 1,待文件记录完毕还原成0;
  2. 将函数传入线程池工作队列,多线程执行写操作:ThreadPoolSaveFile;
  3. 从队列中获取要存储的日志数据体-HslMessageItem;
  4. 开启 文件操作记录锁-m_fileSaveLock,会在操作完毕后14步时释放锁;
  5. 获取文件名称,该函数为虚函数,需要在子类实现GetFileSaveName(1. 单文件;2. 按大小存储;3. 按时间存储;);
  6. 文件名不为空开始进行写,调用StreamWriter,先进行实例化;
  7. while判断存储的实体不为空,不为空一直循环7-11,将队列中的日志存储实体全部出队;
  8. 文件保存前触发事件(一般ui显示日志,或者做写取消操作);
  9. 开启检查锁,判断过滤集合是否包含此日志的关键字keyword,如果不包含则进行写入,释放锁;
  10. 判断写是否取消
  11. 验证都通过后,开始写入操作;
  12. 异常情况:重新将数据存储体进队列,然后进队列一个异常信息数据
  13. 最终finally,dispose掉 StreamWriter;
  14. 释放4中开启的锁-m_fileSaveLock;
  15. 开启原子操作,将 m_SaveStatus 由1更改成0;
  16. 再次检查判断队列是否函数元素,有的话递归执行1-16;
posted @ 2023-05-25 22:24  弗里德里希恩格hao  阅读(3)  评论(0)    收藏  举报