用C#写了个日志类

摘要:
以下是如何使用日志写入类:LogWriterlogwriter=newLogWriter();日志编写器。初始化;日志编写器。日志这很简单吗?读取日志比写入日志更复杂,因为当我们获取日志时,我们通常需要从最新的日志中获取,也就是说,向后读取日志!下面是如何使用我的日志读取类:LogReader LogReader=newLogReader();日志读取器。初始化;PagingInfopi=newPagingInfo{ItemNumberPerPage=30,RequestPage=1};LogItem[]项=日志读取器。阅读在开始时,还需要进行初始化,以确定需要读取哪种类型的日志,以及从何时到何时结束日志。读取时,会传递分页信息,以告知每页的条目数和读取日志所需的页数。

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

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

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

 用C#写了个日志类第1张

指定一个日志根目录,它的下面再用“年-月”来划分子目录,再下面就是每天产生一个的日志文件了,准确说是每天每类产生一个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

免责声明:文章转载自《用C#写了个日志类》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Mac OS终端中设置颜色高亮和自动补全【snmp】win7安装和配置snmp下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

详细分析MySQL的日志(一)

官方手册:https://dev.mysql.com/doc/refman/5.7/en/server-logs.html 不管是哪个数据库产品,一定会有日志文件。在MariaDB/MySQL中,主要有5种日志文件: 1.错误日志(error log):记录mysql服务的启停时正确和错误的信息,还记录启动、停止、运行过程中的错误信息。 2.查询日志(ge...

基于jssip的简单封装

import {UA as Agent, WebSocketInterface as Socket, debug} from 'jssip'; import EventEmitter from "./eventEmitter"; debug('JsSIP:RTCSession:DTMF'); export default class SipClient...

一.定时任务详解https://i.cnblogs.com/EditPosts.aspx

定时任务的详解 h每小时运行 d每天运行 w每周运行 m每个月运行 中毒时查看系统定时任务是否有病毒的脚本。 crontab -l 查看用户的定时任务 crontab -e 进入编辑界面增加定时任务 /var/spool/cron/root root用户定时任务的文件 定时任务的使用 一. 二. 查看定时任务日志----一定要会看日志 定时任务时...

【译】C++日志(Logging in C++)

声明:原创翻译,转载请注明出处!http://www.cnblogs.com/mewmicro/p/6432507.html 注:作者Petru Marginean,2007/09/05   日志记录是用于故障排除和维护软件系统的关键技术。Petru提供了一种类型安全,线程安全和可移植的C ++日志框架。           日志记录是用于故障排除和维护软...

Mysql数据按天分区,定期删除

需求:   1.日志表需要按天分区   2.只保留一个月数据 方案:   1.创建两个事件,一个事件生成未来需要的分区,另一个事件定期检查过期数据(移除分区)   2.创建事件每小时执行一次,删除事件每天执行一次   3.事件开始时需要先创建一个当前所需分区 全量方法:   1.先构造存储过程 create_partition_today :将表转化为分区...

使用 js 测试 websocket 连接

参考:https://blog.csdn.net/linysuccess/article/details/109223712 配合上篇文章,代码如下: <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <m...