画布 1
LOG类
  CLog4NetParser类
    将log写入磁盘
    ErrorLine
    FatalLine
    ProcessInfo
    WriteLine
    GetFileName
  LogCollection类
    Add(int level, string message)
      Add(LogLevel level, string format, object arg0)
      Add(LogLevel level, string format, params object[] args)
    int Count(int type)
    成员变量
      RingList<LogElement> logList = new RingList<LogElement>();
      uint elementCount;
      Dictionary<int, RingList<LogElement>> classifiedLogList
    LogElement Fetch(int type, int index)
    public void WriteToStream(StreamWriter stream)
    属性
      MaxSize
        获取本身loglist的尺寸
        设置本身loglist的最大尺寸
设置字典里每个loglist的最大尺寸
    1.输入type<0,自身成员变量loglist的数量
2.输入type>=0在字典里找loglist,没找到返回0
    获取某个类型的某条记录
从本身的loglist里读取或者字典里找某条记录
    将本身loglist的记录写入到数据流里
  RingList类
  LogElement
    成员变量
      public int Level;
      public string Message;
      public uint Number;
      public DateTime TimeStamp;
  LogStorage
    成员变量
      private static LogCollection m_Logs = new LogCollection(20000);
        log存储接口
  LogView
    EnsureVisible
      高亮选中
    private void LogView_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
    private void viewTimer_Tick(object sender, EventArgs e)
      定时刷新
    读取需要的值,如果当前值的level不等于0,而log的level等于0 格子颜色粉红色
    获取当前view的level的行数量
如果是自动更新的刷新当前行
  自由主题
  存储的一条log记录
  其实没什么用处,转调用了Logcollection
private void LogView_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
{
LogElement log = this.m_Logs.Fetch(this.Level, e.RowIndex);
switch (e.ColumnIndex)
{
case 0:
e.Value = log.Number.ToString();
break;
case 1:
e.Value = log.TimeStamp.ToString("HH:mm:ss.fff");
break;
case 2:
e.Value = log.Message;
break;
}
if (this.Level != 0 && log.Level == 0)
{
base[e.ColumnIndex, e.RowIndex].Style.BackColor = Color.Pink;
return;
}
base[e.ColumnIndex, e.RowIndex].Style.BackColor = Color.White;
}