zoukankan      html  css  js  c++  java
  • 用C#写了个日志类

    日志的作用我想不必我多说了,在做BS架构的程序的时候,我们通常会把日志写在数据库的某张表中,这样带来的好处是便于查询,使用SQL语句十分方便而灵活,但缺点也是显而易见的,那就是造成数据库负担过重,随着日志不断增加,表的尺寸也会变得越来越庞大,性能也会渐渐下降,所以我打算把日志保存到文本文件中去,纯文本文件的写入可是要比数据库快很多的。

    然而目前已经存在的日志类库都过于庞大和复杂,不太适合我的情况,我要求仅仅是写日志文本文件,当然还有读取,并不需要复杂的功能,于是我自己动手写了一个。下面讲讲我的设计。

    日志会被记录到一个目录中,目录结构大致如下:

     

    指定一个日志根目录,它的下面再用“年-月”来划分子目录,再下面就是每天产生一个的日志文件了,准确说是每天每类产生一个log文件,当然了,如果当天没有任何日志,就没有相应的日志文件。

    下面是我的写日志类的使用方法:

    LogWriter logwriter = new LogWriter();
    logwriter.Init(Application.StartupPath + "\\log");
    logwriter.Log("OP", "jgg", "把编号从{0}改为了{1}", 30, 35);

    是不是非常简单?第一个参数是日志类型,上面我传入的是“OP”,生成的日志文件就是OP_14.log(我写这篇博客时候是2012年4月14日);第二个参数可以看作是小分类,通常可以用来记录一个错误代码,或一个操作者;之后的参数跟string.Format()方法的参数是一样的了,表示这条log的“正文”。

    需要额外说明的是,为了避免写文件导致的混乱,LogWriter只允许一个实例,通常建议把LogWriter对象声明为static的,这样就不会有什么问题了,然后,初始化,并写日志即可,无需关心日志文件的打开和关闭问题。

    读日志比写日志要复杂一些,因为我们获取日志的时候往往是需要从最近的获取,也就是说:倒着读!而文件流可没有“倒着读”的功能,所以只好用顺着读,倒着排。而比较麻烦的是我并不知道第N行在文件流的哪个位置,比较好的解决方法是在每一行内容上带上行号,这样找起来就比较方便了,但我没这么干,我从简单起见,从文件开头起,一行行读来确定是第几行,这样做效率就比较低了,但考虑到读日志这个操作还是挺少的,所以效率低尚能接受。

    下面是我的读日志类的使用方法:

    LogReader logreader = new LogReader();
    logreader.Init(Application.StartupPath + "\\log", "OP", DateTime.Now, DateTime.Now);
    PagingInfo pi = new PagingInfo { ItemNumberPerPage = 30, RequestPage = 1 };
    LogItem[] items = logreader.Read(pi);

    一开始同样需要初始化,告诉需要读什么类型的日志,从哪个时间开始到哪个时间结束的日志,读的时候把分页信息传入,告诉读日志类要求每页有多少条,和要求第几页。

    读日志类和写日志类不同,它允许多个实例,这个不作限制,因为读操作不改变内容,不会因为同时多个线程在读而产生混乱,剩下来可以改进之处就是把LogItem[]改为IEnumerable<LogItem>这样的接口,看起来更具技术含量些。

    代码下载:https://files.cnblogs.com/guogangj/Logging.zip

  • 相关阅读:
    servlet&jsp高级:第四部分
    servlet&jsp高级:第三部分
    servlet&jsp高级:第二部分
    servlet&jsp高级:第一部分
    Servlet&jsp基础:第四部分
    Servlet&jsp基础:第三部分
    Servlet&jsp基础:第二部分
    Servlet&jsp基础:第一部分
    关于各地区并发高的解决思路
    Intellij IDEA使用restclient测试
  • 原文地址:https://www.cnblogs.com/guogangj/p/2446949.html
Copyright © 2011-2022 走看看