网站日志访问记录组件UserVisitLogsHelp开源了!
之前在《一种基于自定义代码记录用户访问日志在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) |
当前请求访问时间 |
三种典型的应用场景:
<add name="WebsiteVisit" type="NetOpen_System.Component.WebsiteVisitHttpModule, NetOpen_System.Component.WebsiteVisit"/>
</httpModules>
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;" />
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;" />
<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>
|
本博客为软件人生原创,欢迎转载,转载请标明出处:http://www.cnblogs.com/nbpowerboy/p/3158507.html。演绎或用于商业目的,但是必须保留本文的署名软件人生(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。SharePoint商业智能技术QQ群:140668362,.Net技术交流QQ群:195516928,欢迎各位加入交流。 |
网站日志访问记录组件UserVisitLogsHelp开源了!的更多相关文章
- Shell 命令行统计 apache 网站日志访问IP以及IP归属地
Shell 命令行统计 apache 网站日志访问IP以及IP归属地 我的一个站点用 apache 服务跑着,积攒了很多的日志.我想用 shell 看看有哪些人访问过我的站点,并且他来自哪里. 因为日 ...
- 一个简易Asp.net网站日志系统
前不久在网站上看到了网站日志访问记录组件UserVisitLogsHelp开源了! 这篇博客感觉还不错,就把源码download了下来,学习一下,发现里面的代码书写和设计并不是很好,于是自己改了改.自 ...
- log4net--不可多得的开源日志记录组件
log4net--不可多得的开源日志记录组件 1 前奏 一直在用log4net日志工具,却没时间写个日志给大家分享一下这个工具,趁最近比较空些,好好分享一下这个工具. 2 说明 Log4net介绍就不 ...
- Elmah 日志记录组件
http://www.cnblogs.com/jys509/p/4571298.html 简介 ELMAH(Error Logging Modules and Handlers)错误日志记录模块和处理 ...
- Linux centos7 VMware Apache访问日志不记录静态文件、访问日志切割、静态元素过期时间
一.Apache访问日志不记录静态文件 网站大多元素为静态文件,如图片.css.js等,这些元素可以不用记录 vim /usr/local/apache2.4/conf/extra/httpd-vho ...
- 【干货】.NET开发通用组件发布(四) 日志记录组件
组件介绍和合作开发 http://www.cnblogs.com/MrHuo/p/MrHuoControls.html 日志记录组件功能介绍 通过基类Logger,实现了文本记录日志和数据库记录日志两 ...
- MVC使用 Elmah 日志记录组件
在后台管理中,有一些操作是需要增加操作日志的,尤其是对一些比较敏感的金额类的操作,比如商城类的修改商品金额.删除商品.赠送金额等人工的操作.日志中记录着相关操作人的操作信息,这样,出了问题也容易排查. ...
- ASP.NET Core 实战:使用 NLog 将日志信息记录到 MongoDB
一.前言 在项目开发中,日志系统是系统的一个重要组成模块,通过在程序中记录运行日志.错误日志,可以让我们对于系统的运行情况做到很好的掌控.同时,收集日志不仅仅可以用于诊断排查错误,由于日志同样也是大量 ...
- NET Core 实战:使用 NLog 将日志信息记录到 MongoDB
NET Core 实战:使用 NLog 将日志信息记录到 MongoDB https://www.cnblogs.com/danvic712/p/10226557.html ASP.NET Core ...
随机推荐
- Tensorflow入门(安装)
TensorFlow是将复杂的数据结构传输至人工智能神经网中进行分析和处理过程的系统.主要用于深度学习(神经网络)方面的研究与应用.Tensorflow适用与Python.C++.Java,本博客中主 ...
- django.db.utils.OperationalError: 1045错误
django.db.utils.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using pass ...
- 关于CSRF的那点事儿
0x01 CSRF简介 CSRF,也称XSRF,即跨站请求伪造攻击,与XSS相似,但与XSS相比更难防范,是一种广泛存在于网站中的安全漏洞,经常与XSS一起配合攻击. 0x02 CSRF原理 ...
- 深度学习基础系列(十)| Global Average Pooling是否可以替代全连接层?
Global Average Pooling(简称GAP,全局池化层)技术最早提出是在这篇论文(第3.2节)中,被认为是可以替代全连接层的一种新技术.在keras发布的经典模型中,可以看到不少模型甚至 ...
- 学会使用DNSPod,仅需三步
学会使用DNSPod,仅需三步 第一步:在DNSPod添加记录 1.访问 https://www.dnspod.cn网站,在DNSPod官网首页的右上角,有[注册],如下图所示,点击[注册]按钮 ...
- 用 Python 实现一个大数据搜索引擎
搜索是大数据领域里常见的需求.Splunk和ELK分别是该领域在非开源和开源领域里的领导者.本文利用很少的Python代码实现了一个基本的数据搜索功能,试图让大家理解大数据搜索的基本原理. 布隆过滤器 ...
- android viewStub
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 开发应用的时候,需要根据条件决定显示某个视图, 这个时候可以用ViewStub Stub ...
- 【线段树】【扫描线】Petrozavodsk Winter Training Camp 2018 Day 5: Grand Prix of Korea, Sunday, February 4, 2018 Problem A. Donut
题意:平面上n个点,每个点带有一个或正或负的权值,让你在平面上放一个内边长为2l,外边长为2r的正方形框,问你最大能圈出来的权值和是多少? 容易推出,能框到每个点的 框中心 的范围也是一个以该点为中心 ...
- 【平面图最小割】BZOJ1001- [BeiJing2006]狼抓兔子
[题目大意]左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下三种类型的道路 1:(x,y)<==>(x+1,y) 2:(x,y)<==>(x,y+1) ...
- GNU C __attribute__ 机制简介
摘要: 在学习linux内核代码及一些开源软件的源码(如:DirectFB),经常可以看到有关__attribute__的相关使用.本文结合自己的学习经历,较为详细的介绍了__attribute__相 ...