サイト内検索: ナビゲーション リンクのスキップ

  昨日:6  本日:3  合計:80844


アクセス解析

 自分のサイトのアクセス状況は当然気になると思います。
 ASP.NETには、アプリケーション管理用のファイル(Global.asax という名前のファイル)をサイト内に置くことで、そのASP.NETサイト内にある全てのファイル(ページ等)に対し監視するという、とても便利な機能が用意されています。

 それぞれのファイルに対しリクエスト処理を開始する前に発生する(Global.asaxのApplication_OnBeginRequest)イベントに、データベース追加処理(アクセスログの追加)を記載して、それをアクセス日別・月別、アクセスURL、リンク元URL、ホスト名、ブラウザ種別で集計するページを作成してみました。

 動作サンプル

※Default.aspx、Page1.aspx、Page2.aspxの3ページに対するアクセスログの集計を行います。
※集計ページへは、「accesslogへ」リンクからお進みください。
※動作サンプルでは期間テキストボックスに、Ajax Control ToolkitのCalendarExtenderを使用していますが、サンプルファイルには含まれませんので、ご了承ください。

 サンプルファイルダウンロード(データベース版)

○動作チェックの方法
1.上記よりサンプルファイルをダウンロードして、任意の場所(デスクトップなど)に解凍します。

2.スタートメニューよりVWD2008を起動し、Webサイトを開くを選択し、先ほど解凍した[accessLogDb]フォルダを選択して、[開く]ボタンをクリックする。

3.[Ctrl]+[F5]キーを押すか、上部メニューから[デバッグ]→[デバッグなしで開始]を選択して実行してください。

※データベースには、MicroSoft Access(Jet 4.0) mdbファイルを使用していますが、データベースデザインを変更する必要がなければ、MicroSoft Accessのインストールも必要ありません。

※参考までに、CSV(カンマ区切りテキストデータ)ログ記録版も用意しましたが、集計用のページはありませんので、ご注意ください。

 サンプルファイルダウンロード(CSVテキスト版)

■ アクセスカウンタにも応用

 Webサイトに対しリクエストを開始する前に発生する(Global.asaxのSession_Start)イベントに、ログを保存する処理を別に設けて、カウントアップする方法もありますが、日別や同一ホストを除外するというような条件を考慮した上でカウントアップするのであれば、アクセスログ解析を応用したほうが簡単です。

※1日のアクセスが多くなったり、期間が長くなるなどして、アクセスログが蓄積されデータベースが肥大化するに比例して処理も重くなりますので、適当な時期にデータベースの切り分け等の処理を盛り込む必要もあるでしょう。

 下記は、昨日Label(ID:lblYday)、本日Label(ID:lblDay)、合計Label(ID:lblTcnt)を配置した、このホームページアクセスカウンタ(同一ホスト集計 2009/05/05~)のソースです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

Imports System.Data.OleDb

Partial Class xxxxxx
  Inherits System.Web.UI.Page

  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    'データリーダ定義
    Dim dr As OleDbDataReader
    'コネクション定義
    Using cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & _
                    
"Data Source=" & _
                    Server.MapPath(
"App_Data/accesslog.mdb"))
      'データコマンド定義
      Dim sqlCom As New OleDbCommand("SELECT Left([accdate],10) AS [date], " & _
                    
"accesslogs.host FROM accesslogs GROUP BY " & _
                    
"Left([accdate],10), accesslogs.host", cn)
      'コネクションを開く
      cn.Open()
      'データリーダにデータコマンド内容で読み込み
      dr = sqlCom.ExecuteReader()

      Dim tCount As Integer = 0 'トータルカウント変数定義
      Dim ydayCount As Integer = 0 '昨日カウント変数定義
      Dim dayCount As Integer = 0 '本日カウント変数定義

      'データリーダのレコードが無くなるまで順に読む
      Do Until dr.Read = False
        'accdate(アクセス日)が本日の時、カウントアップ
        If dr(0) = Left(Now.ToString, 10) Then
          dayCount = dayCount + 1

        End If
        'accdate(アクセス日)が昨日の時、カウントアップ
        If dr(0) = Left(Now.AddDays(-1).ToString, 10) Then
          ydayCount = ydayCount + 1

        End If
        'トータルカウントはすべてカウントアップ
        tCount = tCount + 1
      Loop
      lblTcnt.Text = tCount 'トータルカウントをLabelに代入
      lblYday.Text = ydayCount '昨日カウントをLabelに代入
      lblDay.Text = dayCount '本日カウントをLabelに代入
    End Using 'コネクション破棄
  End Sub
End Class

Copyright (C) 2009-2009 ケンゾー
初版:2009年4月17日、最終更新:2009年5月30日
http://www.xox.bz/