之前在《一种基于自定义代码记录用户访问日志在Sharepoint网站的应用方法!》一文利用本人几年前的开发的UserVisitLogsHelp组件进行了网站用户访问日志记录,可用于网站分析,虽然IIS可以有日志记录的功能(也可通过工具分析),但它的主要缺点是可定制性相对较差,难以满足个性化的需求,只能用于windows平台的站点,有很大的局限性。通过该组件不仅能用于asp.net等windows平台网站,也可以用于PHP、JSP等Linux网站。该组件目前已在Codeplex网站中开源了,具体网址如下:http://uservisitlogshelp.codeplex.com/。
该组件实现原理很简单:主要利用IHttpModule接口并在Web.config中的HttpModule节点添加此组件的配置,考虑到性能和可移植性,数据库采用开源Sqlite,方便维护和数据采集。
Sqlite日志数据库网站用户访问日志表(UserVisitLog)结构设计如下:
编号 | 字段名称 | 字段类型 | 备注 |
1 | Id | integer | 自增序号(PK,Not Null) |
2 | UserHostAddress | varchar(20) | 远程客户端的IP主机地址 |
3 | UserHostName | varchar(20) | 远程客户端的DNS名称 |
4 | UrlAbsoluteUri | varchar(1600) | 当前请求的绝对URI |
5 | PhysicalPath | varchar(500) | 当前请求的URL相对应的物理文件路径 |
6 | UserAgent | varchar(1000) | 客户端浏览器的原始用户代理信息 |
7 | HttpMethod | varchar(4) | 客户端使用的HTTP数据传输方法 |
8 | UserLanguages | varchar(20) | 客户端语言首选项的排序字符 |
9 | UrlHost | varchar(100) | 客户端主机的实例名 |
10 | UrlPort | varchar(10) | 当前URI的端口号 |
11 | TotalBytes | integer | 当前输入流中的字节数 |
12 | ContentLength | integer | 客户端发送的内容长度(以字节计) |
13 | IsLocal | varchar(5) | 当前请求是否来自本地计算机 |
14 | BrowserType | varchar(30) | 浏览器的名称和主(整数)版本号 |
15 | BrowserVersion | varchar(20) | 浏览器的完整版本号(包括整数和小数) |
16 | BrowserPlatform | varchar(20) | 客户端使用的操作系统平台名称 |
17 | BrowserBeta | varchar(5) | 浏览器是否为测试版 |
18 | BrowserActiveXControls | varchar(5) | 浏览器是否支持ActiveX控件 |
19 | BrowserCookies | varchar(5) | 浏览器是否支持Cookie |
20 | BrowserCrawler | varchar(5) | 浏览器是否为Web爬行遍历搜索引擎 |
21 | BrowserJavaScript | varchar(5) | 浏览器支持的EcmaScript主版本号 |
22 | BrowserSupportsXmlHttp | varchar(5) | 浏览器是否支持通过HTTP接收XML |
23 | BrowserInputType | varchar(30) | 浏览器支持的输入类型 |
24 | BrowserScreenPixelsWidth | integer | 浏览器显示的近似宽度(单位像素) |
25 | BrowserScreenPixelsHeight | integer | 浏览器显示的近似高度(单位像素) |
26 | UrlReferrerAbsoluteUri | varchar(1600) | 客户端上次请求(该请求链接当前的URL)的绝对URI |
27 | UrlReferrerAbsoluteUriDecode | varchar(1600) | 对UrlReferrerAbsoluteUri字段进行zh-cn或utf-9解码 |
28 | UrlReferrerHostName | varchar(100) | 客户端上次请求(该请求链接当前的URL)的DNS名称 |
29 | CanCombineFormsInDeck | varchar(5) | 浏览器是否支持包括多个窗口的卡片组 |
30 | IsMobileDevice | varchar(5) | 浏览器是否为已识别的移动设备 |
31 | MobileDeviceManufacturer | varchar(30) | 已知移动设备制造商的名称 |
32 | MobileDeviceModel | varchar(30) | 已知移动设备的型号名 |
33 | NumberOfSoftkeys | integer | 移动设备上软键的数目 |
34 | ContentEncoding | varchar(10) | 内容字符的编码 |
35 | ScreenBitDepth | integer | 浏览器显示的近似深度(单位像素) |
36 | Website | varchar(100) | 访问Web站点 |
37 | WebCookies | varchar(80) | 记录当前访客的惟一Cookies值 |
38 | VisitTime | varchar(20) | 当前请求访问时间 |
三种典型的应用场景:
1.asp.net(SharePoint) 网站
在web.config 的 <httpModules> 节点加入:
<httpModules> <add name="WebsiteVisit" type="NetOpen_System.Component.WebsiteVisitHttpModule, NetOpen_System.Component.WebsiteVisit"/>
</httpModules>
2.SharePoint 网站
独立部署的网站日志访问站点,可以通过JS代码方式进行页面跟踪,对于企业内部网站可以取得登录AD的用户信息:
<script type="text/javascript" >
SP.SOD.executeOrDelayUntilScriptLoaded(runMyCode, "SP.js");
var currentUser = null;
var currentUserTitle=null;
function runMyCode() {
var ctx = new SP.ClientContext.get_current();
var web = ctx.get_web();
ctx.load(web);
var user = web.get_currentUser();
user.retrieve();
ctx.executeQueryAsync(
function () {
//only in the success case you can work with user login
currentUser= user.get_loginName();
currentUserTitle = user.get_title();
document.getElementById("randimg").src="http://webloggersite/Default.aspx?UserName=" +currentUser+"&UserTitle="+currentUserTitle;
},
function (data) {
//notify the failure
});
}
</script>
<img id="randimg" name="randimg" src="" style="width:0;height:0;" />
3.其他网站(PHP,JSP,ASP等)
网站页面JS跟踪代码:
<script type="text/javascript">
function addImg(isrc) {
var Img = new Image();
Img.style = "width:0;height:0;";
Img.onload = function () {
document.body.appendChild(Img);
}
Img.src = isrc;
}
addImg("http://webloggersite/Default.aspx");
</script>
<img id="randimg" name="randimg" src="" style="width:0;height:0;" />
自动生成日志数据库Sqlite的配置文件(日志数据库可按年,按月,按天或不生成等):
NetOpen_SystemWebsiteVisit.cfg.xml
<?xml version="1.0" encoding="utf-8" ?>
<NetOpen_System>
<WebsiteVisit>
<!--DateSource Automatic Generation of Database File year:one year month:every month day:every day None:Does not generate -->
<SQLiteConnectings DataSource="~/Visit_Data/HomeWeb" Password="12345678" DateSource="day" Website="" ExcludeUrl="" DecodeUrl="" TextDecoding="utf-8" ExcludeUserAgent="" WebCookiesName="" WebCookiesExpires="3650"/>
</WebsiteVisit>
</NetOpen_System>
本博客为软件人生原创,欢迎转载,转载请标明出处 。演绎或用于商业目的,但是必须保留本文的署名软件人生(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。SharePoint商业智能技术QQ群:140668362,.Net技术交流QQ群:195516928,欢迎各位加入交流。 |