wss3.0的Audit特性,记录文档操作,做SharePoint2007文档的点击率

SharePoint中关于文档的跟踪记录和点击率一直是个让人头疼的问题。不过wss3.0的audit功能,可以帮我们一点忙。
Audit功能说白了就是可以跟踪并记录站点集 、网站、列表或者列表项(文档)的操作记录(包括察看、下载、更新等),
并且通过对象模型来访问这些操作记录。 其实除了通过对性模型,我们也可以直接访问数据库来获取操作记录。那我们看看怎么样来做吧!

1. 通过Audit对象模型访问操作记录

在wss3.0中,有几个类和枚举与我们的Audit有关,他们所处的命名空间为Microsoft.SharePoint。

这几个类分别是:

SPAudit

SPAuditEntry

SPAuditEntryCollection

SPAuditQuery

枚举分别是:

SPAuditEventSource
SPAuditEventType
SPAuditItemType
SPAuditLocationType
SPAuditMaskType

其中几个类都很重要,那我们就来看看如果通过对向模型来获站点集、网站、列表或者文档的“记录”情况。
首先,我们要打开Audit开关,这样才能保证我们对网站集、文档等所做的操作会被记录下来。打开Audit开关的代码如下:

using (SPSite sitecol = new SPSite("collectionUrl"))

            
{
            
//设置网站集跟踪所有的操作
                sitecol.Audit.AuditFlags = SPAuditMaskType. All;

                sitecol.Audit.Update();

        }

注意其中的语句:sitecol.Audit.AuditFlags = SPAuditMaskType.All。这句话的意思是打开Audit开关,这样就可以跟踪对应网站集的所有操作了。(当然,所有的跟踪操作都是owstimer这个后台服务来完成的,具体跟踪的原理还需要研究。)
具体的操作我们也可以根据需要选择,使用枚举SPAuditMaskType的其它值来选择不同的跟踪类型:
 All,CheckIn,CheckOut,ChildDelete,Copy,Delete,Move,None,ProfileChange,SchemaChange,Search,SecurityChange,Undelete,Update,View,Workflow

 给文档(列表)库或者文档(列表)打开开关也是同样的方法,在这里我就不重复描述了。(注意:如果要关闭该功能,只要设置SPAuditMaskType. None就可以了)。

OK,现在我们已经打开Audit的开关了,现在我们所做的“一切”动作都会被“记录在案”了。那接下来我们就看看如何获取操作记录。
 要获取操作记录,我们需要使用刚才提到的几个类
SPAudit:Audit类,相当于一个Manager的作用。

SPAuditEntry:具体的操作记录实体,代表着某一个操作。

SPAuditEntryCollection:操作记录实体集合。

SPAuditQuery:操作查询类。
获取网站集操作记录的代码如下:
using (SPSite siteColl = new SPSite("sitecollectionurl"))

      
{

//1、使用站点集构造一个SPAuditQuery类

            SPAuditQuery wssQuery 
= new SPAuditQuery(siteColl);

            
//2、通过站点集的Audit属性得到SPAuditEntryCollection,即该站点集所有操作记录的集合

            SPAuditEntryCollection auditCol 
= siteColl.Audit.GetEntries(wssQuery);

foreach (SPAuditEntry entry in auditCol)

              
{

               
//3、通过遍历就可以得到每条操作记录

              }


    }

注意注解3,我们可以通过操作记录实体(SPAuditEntry)的实例entry去获取相关的属性信息了。SPAuditEntry的属性很多,可以我们经常用到的属性有:
DocLocation:文档的路径(string),被访问或者操作的文档、列表等的相对路径(相对于站点集)。
Event:事件枚举(enum SPAuditEventType),包括:签入、签出、拷贝、删除、更新、查看等等操作。具体操作可以参考wss3.0 sdk
EventName:事件的名称(string)
ItemId:列表项GUID(Guid)
ItemTyp:列表项类型枚举(enum SPAuditItemType),指操作被执行的对象,包括Document,Folder,List,ListItem,Site,Web
Occurred:操作发生的时间(DateTime)
UserId:操作者ID(string)
如果我们要通过条件筛选操作记录,可以在注解2处加上以下代码:
            //获取特定列表操作记录

                wssQuery.RestrictToList(list);

                
//获取特定列表项操作记录

                wssQuery.RestrictToListItem(listItem);

                
//获取特定用户操作记录

                wssQuery.RestrictToUser(userId);

                
//获取特定时间操作记录

                wssQuery.SetRangeStart(starttime);

                wssQuery.SetRangeEnd(endtime);

使用对象模型确实不错,可以获取我们需要的数据,但是却发现几个问题。
第一, 不够灵活。SPAuditQuery对象提供的筛选方法比较少,比如就不能按照操作类型来获取。
第二, 效率不高,通过Reflector反射发现,在SPAuditEntryCollection中存在这样的语句
using (SqlDataReader dr = this.m_query.Site.SqlSession.ExecuteReader(cmd, CommandBehavior.CloseConnection))     {          
while (dr.Read())                 {                        
this.AddDataReaderRow(dr);                 
}
     
}

这段代码的意思是:遍历整个操作记录查询结果来构造SPAuditEntry对象。因此,为了获取更灵活的查询和更高的效率,我们可以直接访问Audit数据库,即通过直接查询数据库表获取我们需要的操作记录。

2  通过数据库访问操作

其实,操作记录的数据在数据库中的存储十分简单,就存储在wss_content_XXX内容数据库的AuditData表中,只要Audit开关打开,该数据表中就会记录对应站点集、网站、列表(文档)库或者列表(文档)的操作记录。
我们可以直接访问数据库去做一些自己需要的查询统计分析了。比如:做某个站点集文档的点集率排名,我们就可以写如下sql作一个简单的统计:
select itemid,count(itemid) as countnum from AuditData where SiteId = @SiteId and Event = 3 and itemtype = 1 group by itemid order by countnum desc

其中Event =3 表示统计查看(下载),Itemtype = 1表示统计文档库
当然我们会发现这样统计会把一些我们不需要的内容也统计进来,比如母版页库的访问,样式库的访问等等。
我们可以通过代码来写一些过滤的方法把我们不需要的内容过滤掉,比如我们可以写一个配置文件,把需要作统计的列表名称列出来,这样就可以把多余的统计内容过滤掉了。
有兴趣的朋友可以一起讨论下具体的实现方式,
我的邮箱是:jiessie327@qq.com,或者回复我!

posted @ 2007-03-15 22:39  零零猪  阅读(4408)  评论(10编辑  收藏  举报