前不久在網站上看到了網站日志訪問記錄組件UserVisitLogsHelp開源了! 這篇博客感覺還不錯,就把源碼download了下來,學習一下,發現里面的代碼書寫和設計並不是很好,於是自己改了改。自己在測試中也發現了一點小問題,同時也記錄出來。
該組件實現原理很簡單:主要利用IHttpModule接口並在Web.config中的HttpModule節點添加此組件的配置,考慮到性能和可移植性,數據庫采用開源Sqlite,方便維護和數據采集。這里數據采集需要一個相應的配置類,結構如下:

FileSource和DateSource兩個屬性共同決定sqllite文件名,DateSource 取值是day,month,year,表示每天、月、年一個數據庫文件。比如我這里是month,生成的文件如下:

ExcludeUrlRegex屬性主要是設置需要排除url對應的正則表達式。很多時候我們並不需要記錄css、js、圖片等靜態資源的訪問日志。
在測試的時候 建議大家不要設置Password屬性,不然在用sqllite管理工具打開數據庫文件時出現錯誤信息。如我這里用SQLlite Administrator錯誤信息如下:

整個web application必須部署到正式的IIS環境,千萬不要使用IIS Express,如果你用IIS Express會出現如下錯誤。

記錄的 Sqlite日志數據庫 結構如下:
| 編號 |
字段名稱 |
字段類型 |
備注 |
| 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) |
當前請求訪問時間 |
至於使用方式我想很簡單,在系統根目錄下創建一個WebSiteVisitConfig.xml 文件,內容如下:
<?xml version="1.0" encoding="utf-8" ?> <WebSiteVisitLog> <WebSiteVisit> <!--FileSource Automatic Generation of Database File year:one year month:every month day:every day None:Does not generate --> <SQLiteConnectings FileSource="~/App_Data/HomeWeb" Password="" DateSource="month" WebSite="" ExcludeUrlRegex=".*\.(js|css|png)" DecodeUrl="" TextDecoding="utf-8" ExcludeUserAgentRegex="" WebCookiesName="" WebCookiesExpires="3650"/> </WebSiteVisit> </WebSiteVisitLog>
同時修改web.config文件如下:
<modules runAllManagedModulesForAllRequests="true">
<add name="WebSiteVisit" type="WebSiteVisitLog.WebSiteVisitHttpModule,WebSiteVisitLog"/>
</modules>
源碼下載地址:http://download.csdn.net/detail/dz45693/7183419
