∈鱼杆 ---我的鱼塘

执着,坚定,友爱,勇敢(www.pumaboyd.com)Live Message

导航

.NET 日志记录模块

Posted on 2008-02-23 23:39  ∈鱼杆  阅读(1694)  评论(0编辑  收藏  举报

327_67888 有朋友突然问我是不是改行搞SEO了。当时听了有点惊奇,原来是blogs上文章最近都是和SEO相关的 (*^__^*)。问问朋友现在忙些什么东西,他说在做一些日志记录的东西,问我有没有什么好的建议(log4.net开源组件不错)。还是具体问了朋友的一些需求,这个和我们的广告统计日志相识。我就想到写这篇文章了,也避免一下,大家认为我SEO去了。

需求及设想:

1:统计每日用户的点击量。
2:考虑到并发和数据库的压力。数据先写入内存,在一定间隔时间将数据变化统一写入数据库。
3:需要考虑扩充统计不同的业务类型,比如 广告统计、注册统计。

业务分析:


业务上有扩展统计类型的需要,那么必然要定义一个服务接口:
Interface IDayLog
服务需要实现的方法:
Add(); 添加日志记录到内存
Save();保存日志记录到数据库
Clear();清空内存日志记录 

 

根据目前业务需求,定义两个业务类:
RegDayLog:IDayLog    每天的登录日志统计
AWDayLog:IDayLog    每天的广告日志统计


这里具体展开一下AWDayLog的系统记录,根据业务需求,需要在子类上添加几个属性:
AWID    需要记录的广告ID
Count    广告ID的增量值
static Dictionary<int, int> adWords    广告的内存数据

 

这些和业务相关类都有了,接下来我们需要一个控制类(和具体业务无关,用来控制业务流程)
static class DayLogHelper   定义几个和业务相关的属性和方法:
static Dictionary<String, IDayLog> dayLogList   当前加载的日志业务列表
CreateLog()    负责加载需要添加日志记录的业务模块
Start()       负责启动日志记录
FindLog(string logName)    根据logName找到相应的日志业务模块

LogName枚举   系统中日志的类型(这个枚举可以通过配置进行忽略)

具体的类图:

dp_log_080223

从UML类图中我们可以得到如下信息:

1:Client类为具体的调用类,从类的关系图中可以很清楚的看到,Client只和LogName 枚举、DayLogHelper、IDayLog 有依赖关系。这就说明,我们在模块的外部已经不依赖具体的业务类了,既然这样,那么业务发生变化也不会影响到Client调用。松耦合了。

2:可以改进的地方。首先看图中标记《3》说明如果要新增业务类,就要要改动DayLogHelper。《1》《2》《3》 这三条依赖关系是需要new 具体的业务对象时产生的。那么如何删除这3条依赖关系呢?如何达到解耦的目的呢?配置文件,通过读取配置文件和反射的方式来创建对象。也就是说,如果我们新增加一个“D币日志统计”,我只要新增一个DCashDayLog类、WebConfig添加一条配置文件就可以了,对日志模块不需要做其他处理。当然Web层上需要调用DayLogHerlper添加具体的日志数据,但这和模块本身已没关系了。

总结

线上运行的日志模块和这个也差不多,具体的实现代码就不写了。其实说白了就是通过Interface隐藏了具体的业务类型,通过DayLogHelper 封装了具体业务类的创建过程。写累了,喝茶去了!