トップページに戻る

automated アクセスログ解析自動化

ログ取り込み自動化までの準備

  • イントロダクション、サーバー構成、fluentdのセットアップ で fluentd の設定が終わっていると仮定します。ここではアクセスログ取り込みを自動化します。
  • piwik-fluentd >= 2.0.0 で Web サイトに貼りこんだ Piwik の javascript (以下 Piwik traker)のアクセスログから、後追い集計できるようになりました。
  • piwik-fluentd >= 2.0.0 から追加されたファイル、機能については、 (piwik-fluentd >=2.0.0) と表記します。

ディレクトリ構成 (piwik-fluentd <= 1.2.4)

your_own_path は、 piwik-fluentd-1.2.4.tar.gz を展開したディレクトリです。
* piwik-fluentd >= 1.1.0 で変更または、追加。
** piwik-fluentd >= 1.2.0 で変更または追加。

* piwik-fluentd >= 1.1.0 で変更または追加
** piwik-fluentd >= 1.2.0 で変更または追加
/your_own_path/fluentd/
├── bin (fluentd 対応の import_logs.py、シェルスクリプト)
│   ├── GNUmakefile **
│   ├── common.mak
│   ├── cron * **
│   ├── env.sh *(Piwk インストールディレクトリ、Piwik URL、token auth)
│   ├── import_logs.py (Piwik からコピーする)
│   ├── import_logs-230.py.patch (Piwik 2.3.0 の  import_logs.py パッチ)
│   ├── import_logs-241.py.patch (Piwik 2.4.1 の  import_logs.py パッチ)
│   ├── import_logs-261.py.patch (Piwik 2.4.1 の  import_logs.py パッチ)
│   ├── import_logs-270.py.patch (Piwik 2.7.0  の  import_logs.py パッチ)
│   ├── import_logs-280.py.patch (Piwik 2.8.0, 2.8.1, 2.8.2, 2.8.3  の  import_logs.py パッチ)
│   ├── import_logs-290.py.patch (Piwik 2.9.0  の  import_logs.py パッチ)
│   ├── import_logs-291.py.patch (Piwik 2.9.1  の  import_logs.py パッチ)
│   ├── import_logs-2100.py.patch (Piwik 2.10.0  の  import_logs.py パッチ)
│   ├── import_logs-2111.py.patch (Piwik 2.11.1 の  import_logs.py パッチ)
│   ├── import_logs-2112.py.patch (Piwik 2.11.2 の  import_logs.py パッチ)
│   ├── import_logs-2121.py.patch (Piwik 2.12.1 の  import_logs.py パッチ)
│   ├── importlogs-dryun.sh *
│   └── importlogs.sh *
├── exclude (取り込んではいけない URL パスが書かれたファイルを格納)
│   ├── exclude_idsite1.txt
│   ├── exclude_idsite2.txt
│   ├── exclude_idsite3.txt
│   ├── exclude_idsite4.txt
│   └── exclude_idsite5.txt
├── log *(piwik/console core:archive のログ)
├── piwik-patch (Piwik 日本語(マルチバイト)問題解決パッチ)
│   ├── piwik-japan-2.6.1-2.8.0.patch
│   ├── piwik-japan-2.8.1-2.8.3.patch
│   ├── piwik-japan-2.9.0-2.9.1.patch
│   ├── piwik-japan-2.10.0.patch
│   ├── piwik-japan-2.11.1.patch
│   ├── piwik-japan-2.11.2.patch
│   └── piwik-japan-2.12.1.patch
└── td-agent (各サイト毎アクセスログディレクトリ)
    ├── site1 (Web サイト 1 のアクセスログ)
    │   ├── GNUmakefile -> ../../bin/GNUmakefile
    │   ├── IDSITE
    │   ├── MOVECONDITIONS **
    │   └── common.mak
    ├── site2 (Web サイト 2)
    │   ├── GNUmakefile -> ../../bin/GNUmakefile
    │   ├── IDSITE
    │   ├── MOVECONDITIONS **
    │   └── common.mak
    ├── site3
    │   ├── GNUmakefile -> ../../bin/GNUmakefile
    │   ├── IDSITE
    │   ├── MOVECONDITIONS **
    │   └── common.mak
    ├── site4
    │   ├── GNUmakefile -> ../../bin/GNUmakefile
    │   ├── IDSITE
    │   ├── MOVECONDITIONS **
    │   └── common.mak
    └── site5_test_disable (disable を入れると cron 処理からは除外される)
        ├── GNUmakefile -> ../../bin/GNUmakefile
        ├── IDSITE
        ├── MOVECONDITIONS **
        └── common.mak

(piwik-fluentd >= 2.0.0)ディレクトリ構成

your_own_path は、 piwik-fluentd-2.0.3.tar.gz を展開したディレクトリです。
* piwik-fluentd >= 1.2.4 より変更または追加

* piwik-fluentd >= 1.2.4 で変更または追加
/your_own_path/fluentd/
├── bin (fluentd 対応の import_logs.py、シェルスクリプト)
│   ├── GNUmakefile *
│   ├── common.mak
│   ├── cron *
│   ├── env.sh *(Piwk インストールディレクトリ、Piwik URL、token auth)
│   ├── import_logs.py (Piwik からコピーする)
│   ├── import_logs-2141.py.patch *
│   ├── import_logs-2143_3.py.patch *
│   ├── importlogs-dryun.sh *
│   └── importlogs.sh *
├── exclude (取り込んではいけない URL パスが書かれたファイルを格納)
│   ├── exclude_idsite1.txt
│   ├── exclude_idsite2.txt
│   ├── exclude_idsite3.txt
│   ├── exclude_idsite4.txt
│   └── exclude_idsite5.txt
├── log (piwik/console core:archive のログ)
├── piwik-patch (Piwik 日本語(マルチバイト)問題解決パッチ)
│   ├── piwik-japan-2.6.1-2.8.0.patch
│   ├── piwik-japan-2.8.1-2.8.3.patch
│   ├── piwik-japan-2.9.0-2.9.1.patch
│   ├── piwik-japan-2.10.0.patch
│   ├── piwik-japan-2.11.1.patch
│   ├── piwik-japan-2.11.2.patch
│   ├── piwik-japan-2.12.1.patch
│   ├── piwik-japan-2.14.1.patch *
│   └── piwik-japan-2.14.3.patch *
└── td-agent (各サイト毎アクセスログディレクトリ)
    ├── piwik_tracker * (Piwik tracker からのアクセスログ)
    │   ├── GNUmakefile -> ../../bin/GNUmakefile *
    │   ├── IDSITE *
    │   ├── IMPORTRANGE *
    │   ├── MOVECONDITIONS *
    │   └── common.mak *
    ├── site1 (Web サイト 1 のアクセスログ)
    │   ├── GNUmakefile -> ../../bin/GNUmakefile
    │   ├── IDSITE
    │   ├── IMPORTRANGE
    │   ├── MOVECONDITIONS *
    │   └── common.mak
    ├── site2 (Web サイト 2)
    │   ├── GNUmakefile -> ../../bin/GNUmakefile
    │   ├── IDSITE
    │   ├── IMPORTRANGE
    │   ├── MOVECONDITIONS *
    │   └── common.mak
    ├── site3
    │   ├── GNUmakefile -> ../../bin/GNUmakefile
    │   ├── IDSITE
    │   ├── IMPORTRANGE
    │   ├── MOVECONDITIONS *
    │   └── common.mak
    ├── site4
    │   ├── GNUmakefile -> ../../bin/GNUmakefile
    │   ├── IDSITE
    │   ├── IMPORTRANGE
    │   ├── MOVECONDITIONS *
    │   └── common.mak
    └── site5_test_disable (disable を入れると cron 処理からは除外される)
        ├── GNUmakefile -> ../../bin/GNUmakefile
        ├── IDSITE
        ├── IMPORTRANGE
        ├── MOVECONDITIONS *
        └── common.mak

重要

--enable-bot を入れています

すなわち bot もアクセス数として入ります。入れたくなければ、 importlogs.sh の --enable-bot を削除してください。

/your_own_path/fluentd/importlogs.sh --enable-bot あり

python $base_dir/import_logs.py --idsite=$1 --url=$PIWIK_URL --token-auth=$PIWIK_TOKEN_AUTH --config=$PIWIK_INSTALL_DIR/config/config.ini.php --recorders=4 --recorder-max-payload-size=200  --enable-bot -d --log-format-name=apache_fluentd --exclude-path-from=$base_dir/../exclude/exclude_idsite${1}.txt ${2%.gz} 2>&1 | tee ${2%.gz}.archive

Urchin とほぼ数値を合わせるには

importlogs.sh に
Pwik = 2.6.1,2.7.0

--static-extensions-include=jpe,json --static-extensions-exclude=xml --download-extensions-include=img,iso --download-extensions-exclude=asx,xml,pdf,xls,doc,ppt

Pwik >= 2.8.0

--static-extensions-include=jpe,json --static-extensions-exclude=xml --download-extensions-include=img,iso --download-extensions-exclude=asx,xml,pdf,xls,xlsx,doc,docx,ppt,pptx

を追加します。

/your_own_path/fluentd/importlogs.sh
Pwik = 2.6.1, 2.7.0

python $base_dir/import_logs.py --idsite=$1 --url=$PIWIK_URL --token-auth=$PIWIK_TOKEN_AUTH --config=$PIWIK_INSTALL_DIR/config/config.ini.php --recorders=4 --recorder-max-payload-size=200  --enable-bot -d --log-format-name=apache_fluentd --static-extensions-include=jpe,json --static-extensions-exclude=xml --download-extensions-include=img,iso --download-extensions-exclude=asx,xml,pdf,xls,doc,ppt --exclude-path-from=$base_dir/../exclude/exclude_idsite${1}.txt ${2%.gz} 2>&1 | tee ${2%.gz}.archive

Pwik >= 2.8.0

python $base_dir/import_logs.py --idsite=$1 --url=$PIWIK_URL --token-auth=$PIWIK_TOKEN_AUTH --config=$PIWIK_INSTALL_DIR/config/config.ini.php --recorders=4 --recorder-max-payload-size=200  --enable-bot -d --log-format-name=apache_fluentd --static-extensions-include=jpe,json --static-extensions-exclude=xml --download-extensions-include=img,iso --download-extensions-exclude=asx,xml,pdf,xls,xlsx,doc,docx,ppt,pptx --exclude-path-from=$base_dir/../exclude/exclude_idsite${1}.txt ${2%.gz} 2>&1 | tee ${2%.gz}.archive

これらのオプションは、 piwik 標準の import_logs.py にはありません。パッチを当てることで実現します。オプションの説明は import_logs.pyで拡張されたオプション にあります。

Piwik の "ウェブサイトの管理より" Web サイトを加える

"新しいサイトの追加" で、アクセスログを取り込むサイトの個数分ウェブサイトを作っておきます。

fluentd/bin/enb.sh の編集

  1. piwik-fluentd-2.0.3.tar.gz をダウンロードして適当なディレクトリへ解凍してください
  2. your_own_path は、 piwik-fluentd-2.0.3.tar.gz を展開したディレクトリとします
  3. Piwik インストールディレクトリから import_logs.py をコピーし fluentd パッチをあててください。どこにコピーするか、どうやってパッチを当てるかは import_logs.pyで拡張されたオプション で説明しています。
  4. env.sh 内に記述がある Piwik をインストールしたディレクトリ、Piwik の URL、トークンを編集します。

enb.sh の各項目について

env.sh 例:

export PIWIK_INSTALL_DIR=/var/www/piwik
export PIWIK_URL=http://piwik.example.com/
export PIWIK_TOKEN_AUTH=your_token
export PIWIK_TRACK_SERVER_DIVIDED=0
export PIWIK_TRACK_INSTALL_DIR=/var/www/piwik
export PIWIK_TRACK_URL=http://piwik.example.com/
export PIWIK_TRACK_TOKEN_AUTH=your_token
export PIWIK_BULK_ARCHIVE=1
PIWIK_TRACK_ で始まる環境変数は、piwik-fluentd >=2.0.0 で追加されています。

PIWIK_INSTALL_DIR

piwik をインストールしたディレクトリです。

PIWIK_URL

piwik の URL です。import_logs.py から piwik の http API を使って piwik のデータベースにログを登録するために使用されます。

PIWIK_TOKEN_AUTH

import_logs.py から piwik の http API を使って piwik のデータベースにログを登録する際使用されます。トークンは システムの構成→ユーザー で表示できます。VIEW 権限のみのユーザーのトークンは使えません。

(piwik-fluentd >=2.0.0)PIWIK_TRACK_SERVER_DIVIDED

Piwik tracker ログを解析するときのみ、PIWIK_INSTALL_DIR, PIWIK_URL, PIWIK_TOKEN_AUTH を別にしたいとき 1 にします(Piwik tracker ログ解析と、apache ログ解析のサイトを完全に分離したいときの使用を想定しています)。

(piwik-fluentd >=2.0.0)PIWIK_TRACK_INSTALL_DIR

PIWIK_TRACK_SERVER_DIVIDED = 1 のとき有効で Piwik tracker ログを解析するときのみ PIWIK_INSTALL_DIR の代わりに使用されます。

(piwik-fluentd >=2.0.0)PIWIK_TRACK_URL

PIWIK_TRACK_SERVER_DIVIDED = 1 のとき有効で Piwik tracker ログを解析するときのみ PIWIK_URL の代わりに使用されます。

(piwik-fluentd >=2.0.0)PIWIK_TRACK_TOKEN_AUTH

PIWIK_TRACK_SERVER_DIVIDED = 1 のとき有効で Piwik tracker ログを解析するときのみ PIWIK_TOKEN_AUTH の代わりに使用されます。

PIWIK_BULK_ARCHIVE console core:archive を実行するタイミング

  • 複数のサイトのログをすべて取り込んで最後に console core:archive を実行
    export PIWIK_BULK_ARCHIVE=1
    
    console core:archive の実行結果は /your_own_path/fluentd/log/archive.log に出力されます。
  • 1 ファイルごとに console core:archive を実行(動作が非常に遅くなります)
    export PIWIK_BULK_ARCHIVE=0
    
    console core:archive の実行結果は /your_own_path/fluentd/td-agent/各サイト/access.時間_X.log.archive それぞれに出力されます。

PIWIK_BULK_ARCHIVE console core:archive を実行するタイミング

fluentd/exclude の準備

ファイル名 exclude_idsite+siteid(下記).txt を用意し、取り込まない URL を記述します。 Piwik の設定と同様にワイルドカードが指定できます。取り込まない URL がない場合も空のファイルを作らなければなりません。(piwik-fluentd >=2.0.0)Piwik tracker ログの解析するこのファイルは読み込みませんので不要です。

例:

% cat exclude_idsite1.txt
/robots.txt
/humans.txt
/favicon.*

Piwik ウェブサイトの管理の id について(siteid)

  1. 管理者で piwik にログインします。
  2. Administration (画面右上)→ Websites (画面左のメニュー)の順にクリック
  3. 表示される Websites Management で表示されている Web サイト一覧の ID の項目です。

fluentd/td-agent/site1 の準備

このディレクトリにはすでに fluentd からアクセスログが書き込まれているはずです。make の仕組みを使い、piwik にアクセスログが取り込み済かどうかを判定するのでそのための準備をします。

  • 複数サイトがある場合は site2, site3, site4... も同様必要ファイルを作成します。
  • (piwik-fluentd >=2.0.0) Piwik tracker のディレクトリも同様ですに準備します。
% cd /your_own_path/fluentd/td-agent/site1 
% ln -s ../bin/GNUmakefile .
% cp ../bin/common.mak .

fluentd/td-agent/site1/common.mak の書き換え、dry-run 実行にする

  • dry-run にすればアクセスログを読み込むものの、piwik データベースに反映されません
#
# common.mak
#

#IMPORTLOGS=../../bin/importlogs.sh
IMPORTLOGS=../../bin/importlogs-dryrun.sh → アクセスログのスキャンはするけど、piwik に反映しない 
TARGETMAK=target.mak

.SUFFIXES:      .gz .archive

.gz.archive:
        $(IMPORTLOGS) $(IDSITE) $<

IDSITE の作成

apache ログ解析時

  • site1 のアクセスログが Piwik ウェブサイトの管理のどの id とヒモづくかを定義

例: siteid = 4 のアクセスログである

% cd /your_own_path/fluentd/td-agent/site1 
% echo 'IDSITE=4' > IDSITE 

(piwik-fluentd >=2.0.0)Piwik tracker ログ解析時

  • Piwik tracker からのアクセスログ解析は各 siteid からのログが全部一緒になるため、便宜上 siteid = 0 と定義します。
  • fluentd/td-agent/piwik_tracker がインストール時に準備されているので、特に書き換える必要はありません。

例: Piwik tracker からのアクセスログ解析は siteid = 0 とする

% cd /your_own_path/fluentd/td-agent/piwik_tracker
% echo 'IDSITE=0' > IDSITE 

MOVECONDITIONS の作成

  • 取り込み前+取り込み済 の site1 のアクセスログをいくつ残すのかを定義、個数を超えるときは古いファイルからサブディレクトリに転送します
    • ただし 取り込んでいないログは転送しません
  • LEAVEFILES=数値 残したいファイル数
    • 最大 2000 くらいでお願いします(3000 だと確実に落ちます)。
  • DESTDIR=転送先ディレクトリ(スペース入りは不可)
  • (piwik-fluentd >=2.0.0)Piwik tracker ログも同様に設定します。

例: 取り込み済のアクセスログを 1000 残して、1000 を超えたファイルをは done (fluentd/td-agent/site1/done) に転送します

% cd /your_own_path/fluentd/td-agent/site1 
% vi MOVECONDITIONS
LEAVEFILES=1000
DESTDIR=done

(piwik-fluentd >=2.0.0)IMPORTRANGE の作成

  • ログを取り込む時間範囲を指定できます。
  • 時間範囲外のログは 取り込み済となりますが、Piwik データベースには反映されません。
  • Piwik tracker ログも同様に設定します。
  • 通常は IMPORT_START=infinity, IMPORT_END=infinity で運用します。何らかのトラブルで一部期間のログデータベースを再構築したいときに使用します。
  • タイムゾーンはログのタイムゾーンとなります。 GMT ではありません。

例: すべてのログを Piwik データベースに反映(通常運用)

IMPORT_START=infinity
IMPORT_END=infinity

例2: 2015-10-12 00:00:00 から 2015-10-12 23:59:59 までのログを Piwik データベースに反映、そのほかは無視

IMPORT_START=2015-10-12:00:00:00
IMPORT_END=2015-10-12:23:59:59

例3: 2015-10-12 23:59:59 までのログを Piwik データベースに反映、そのほかは無視

IMPORT_START=infinity
IMPORT_END=2015-10-12:23:59:59

例4: 2015-10-12 00:00:00 からのログを Piwik データベースに反映、そのほかは無視

IMPORT_START=2015-10-12:00:00:00
IMPORT_END=infinity

テスト

site1 でのテスト

% cd /your_own_path/fluentd/td-agent/site1 
% sudo -u td-agent make depend
% sudo -u td-agent make
% sudo -u td-agent make moveimportedlogs
  • make depend を実行すると target.mak ファイルが作成されます。
  • access.時間_X.log.gz を取り込み終わると、access.時間_X.log.archive というファイルができます。 このファイルに実行結果が取り込まれています。後程設定する cron は owner を td-agent:td-agent で実行しますので、特に console core:archive が失敗していないかどうか確認してください。 owner td-agent:td-agent で piwik のワークディレクトリに書き込みが行えないとエラーとなります。
  • access.時間_X.log.archive ファイルを消去したり、access.時間_X.log.gz よりタイムスタンプが古いと、再取り込みの対象となります。 例: access.20140702T09_0.log.gz の処理後 access.20140702T09_0.log.archive というファイルが出来上がる。
  • make moveimportedlogs で、取り込み済の 1000 以上のファイルは、done (fluentd/td-agent/site1/done) ディレクトリに転送されます。ディレクトリがないときは、作成されます。
    • 保存ファイル数と、ディレクトリは上記 MOVECONDITIONS ファイルで任意に設定できます。

時間_X については fluentdのout_fileプラグインの仕様について を参照してください。なおここで、デフォルトでは 256m 毎に分割されるとありますが実際は 8m 毎です。

cron テスト(site1 でのテストから続けて)

  • env.sh で PIWIK_BULK_ARCHIVE=1 のときは console core:archive は実行されません。  ですから、実際に cron でテストします(話が前後しますが下の章 cron で定時実行 を参照してください)。
  • make claen で site1 の target.mak と .archive ファイルを消去します。
  • 終わったら /your_own_path/fluentd/td-agent/log/archive.log を確認します。 console core:archive が失敗していないかどうか確認してください。 owner td-agent:td-agent で piwik のワークディレクトリに書き込みが行えないとエラーとなります。
    % cd /your_own_path/fluentd/td-agent/site1
    % make clean
    % ../../bin/cron 
    

テストが終わったら

  • target.mak と .archive ファイルを消去します。
% make clean

fluentd/td-agent/site1/common.mak の書き換え、dry-run 実行を 解除

#
# common.mak
#

IMPORTLOGS=../../bin/importlogs.sh
#IMPORTLOGS=../../bin/importlogs-dryrun.sh
TARGETMAK=target.mak

.SUFFIXES:      .gz .archive

.gz.archive:
        $(IMPORTLOGS) $(IDSITE) $<

cron で定時実行

  • td-agent で動かします。
  • /your_own_path/fluentd/td-agent 以下のディレクトリをスキャンし、スキャンしたディレクトリ内で make depend; make を順に実行します
  • /your_own_path/fluentd/td-agent 以下のディレクトリ名に disable が含まれているとスキップします
  • cron の次の回が当って二重実行されないように実行間隔を調整してください

/etc/crontab に以下の設定をします。

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
15 * * * * td-agent /your_own_path/fluentd/bin/cron
開始分を 15 しているのは、 fluentd がデフォルトでログ遅延を 10 分まつからです。上記の設定だと、毎時、fluentd アクセスログのファイルが切り替わりますが、遅延を 10 分間受け付けて毎時 11 分ごろに 前の一時間分のログを出すためです。 12 にしてもいいでしょう。 一時間に 2 度実行してもいいですが、 アクセスログ取り込み中に cron の次の回が当って二重実行されないように調整します。 月初は console core:archive の処理が速いのですが、月末に近づくにつれて遅くなるので注意が必要です。 月末の処理時間は、月初の 10 倍程度 を見込んでください。