Matomoにアクセスログをインポートしてログ解析

(yyyy.mm.dd追記)

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392066/eb35152d-3d42-8a26-ad00-e6d40a30c81b.png)

# はじめに

Webアクセス解析をしてくれる**Matomo**の紹介です。

アクセス解析するのに、最近ですと**Googleアナリティクス**があり、
該当Webサーバにトラッキングコードを仕込めばアクセス解析が行えるようになります。

ただ、いざアクセス解析仕様となった際

- オンプレ環境で解析したい
- トラッキングコード仕込むなど、htmlファイルを変更したくない

といった要件が入ってきた場合Matomoだと、
**Webサーバのログをインポートすることでアクセス解析が可能**です。

もちろん

- トラッキングコードを仕込んで解析
- 動的にコンテンツが生成されるWordpressにプラグイン導入してアクセス解析

することも可能ですので、**オンプレ環境**でアクセス解析したいならMatomoはおすすめです。


# Matomoとは？(元Piwik)

上でも話している通り、MatomoはWebアクセス解析をしてくれるツールです。
もともとはPiwikという名前でしたが、少し前に名前が変わったようです。
詳しくは以下の公式ページや日本ユーザー会のページを御覧ください。

- [Matomo 公式](https://matomo.org/)
- [Matomo JA](https://matomo.jp/)

ちなみに、Matomoは日本語の「まとも」からきているらしいですが、
開発元が日本というわけではないです。


# アクセス解析する方法

Matomoでは二通りのアクセス解析方法があり、それぞれにメリットとデメリットがあります。
導入する環境に併せてどちらにするか決めましょう。

| 案 | メリット | デメリット
|:---|:---|:---|
|htmlファイルに<br>トラッキングコード追記|・htmlファイルが少なければサクッと導入できる<br>(Wordpressだとプラグイン導入必要)<br>・案2より詳細な情報(※)を得ることが可能 |・htmlファイル数が多いと導入コストが高くなる |
|アクセスログを<br>直接インポート|・Webコンテンツは手を一切加える必要がない<br>・IISやApacheなど様々なログフォーマット形式が対応 |・Python(2.6 or 2.7)が必要<br>・ログファイルが大きいと処理するのに時間かかる |

(※)OSやブラウザソフト、画面サイズなど


# 構築の流れ

ここからはCentOS7を前提に、構築していきます。
前提条件は[ここらへん](https://matomo.org/docs/requirements/)に書かれてますが、ざっくりと以下の手順となります。

1. Apacheインストール
2. PHP(7.x)インストール
3. MySQL(5.7↑)インストール
4. Matomoインストール
5. Matomo初期設定

なお、1〜4部分をVagrant＆Ansibleで構築するファイルを[Github](https://github.com/iguru0331/matomo)に公開してますので、
興味ある方は覗いてみてください。


## 1.Apacheインストール

httpdの起動、自動起動登録を忘れずに。
ついでに動作検証用にテストページを```/var/www/html/test.html```へ格納しておくと良いです。

## 2.PHPインストール

[公式](https://matomo.org/docs/requirements/)でも書いてあるとおり、**バージョン7.xが推奨**です。
公式の記載通り、ここあたりをインストールしましょう。

- php
- php-curl
- php-gd 
- php-cli 
- php-mysql 
- php-xml 
- php-mbstring

## 3.MySQLインストール

バージョンは5.7以上が推奨となっております。
インストール後はMySQLを起動してから以下を行います。

- Matomo用ユーザ、パスワード作成
- Matomo用DB作成、Matomo用ユーザに権限付与

あとでMatomoの初期設定する際にそれぞれ聞かれますので、適当に名前を決めてOKです。


## 4. Matomoインストール

公式からインストーラをダウンロード後、```/var/www/html```あたりで解凍したものを入れます。
apacheへ所有者と所有グループ変更してサイトアクセスすればMatomoのようこそ画面が表示されます。

もしもうまく表示されなかったらSELinuxあたり無効にしてみましょう。

## (番外)VagrantとAnsibleでサクッと構築

もしもVagrantとAnsible両方使える環境がありましたら、
以下のVagrantfileとプレイブックをクローンして実行するとMatomo構築までできます。

SELinux無効反映に伴う再起動のため、Vagrantのプラグインで```vagrant-reload```を導入してます。
また、デフォルトのVagrantfileだと192.168.22.11にprivate networkで接続されるので、
他の構成にしたい場合は適宜変更してください。

[matomo用Vagrantfileとプレイブック](https://github.com/iguru0331/matomo)

仕事でAnsible少し使ってましたがホント便利ですよね。
VagrantのプロビジョニングをAnsibleにやらせてるのでだいぶ楽に構築できます。

```:各ソフトウェア情報
$ vagrant -v
Vagrant 2.2.10

$ ansible --version
ansible 2.9.11
~
$ vagrant box list
centos/7 (virtualbox, 2004.01)

$ vagrant plugin list
vagrant-reload (0.0.1, global)
```

```:Matomoをサクッと構築
$ git clone https://github.com/iguru0331/matomo.git

$ cd matomo

$ vagrant up
```

## 5. Matomo初期設定

※ここからはgithubのVagrantfileで構築した前提で進めます。

### Matomoアクセス

![スクリーンショット 2020-09-19 8.52.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392066/f2c0880b-2107-3135-fd2b-351b46fa9dfa.png)

matomoを展開した場所をブラウザで開くと初期設定画面が開くので、進めていきます。

### システム確認

![スクリーンショット 2020-09-19 8.54.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392066/53c009bd-f31f-1c93-950e-e0804af9bb17.png)

途中、システムの確認で前提条件が整っているか確認できますので、
足りてない項目があれば適宜設定変更してください。
(※強制SSL接続はMatomoの機能確認するのみなら不要です)

### データベースセットアップ

![スクリーンショット 2020-09-19 9.00.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392066/377a31d2-84c5-1a8d-c23e-31193a8e21fc.png)

作成したデータベースの情報を入力していきます。

Vagrantfileから構築した場合は以下の通り設定入れてください。

|設定項目|設定値|
|:--|:--|
|データベース・サーバー|127.0.0.1(デフォルト)|
|ログイン|matomo|
|パスワード|Vagrant@1|
|データベース名|matomo|
|テーブルプレフィックス|matomo_(デフォルト)|
|アダプタ|PDO\MYSQL|

次のページに移動して、以下のように表示されれば問題なくデータベース作成されております。

![スクリーンショット 2020-09-19 9.12.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392066/fbe641fa-bfc4-1afc-905e-d4cf879ed7bf.png)

### スーパーユーザー

管理者ID、パスワード、メールを入力し、適当にチェックを入れて進めます。
ちなみに、メールアドレスも必須です。

### ウェブサイトのセットアップ

適当に入力していきます、ここではトラッキングタグの機能確認を込めてテストページを設定します。
※特にトラッキングタグの機能確認しない場合、実在しないサイトでもOKです。

![スクリーンショット 2020-09-19 9.19.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392066/8ec24214-1627-19bf-1c97-65b216abf74c.png)

ちなみにeコマースはインターネット経由で決済する総称のようです。
ここではアクセス解析が主体なので詳細は割愛します。

### トラッキングタグ

**※トラッキングタグの機能確認不要でしたら以降の工程を飛ばして大丈夫です**

前ページで設定したサイト用のトラッキングコードが生成されます。
記載の通り、トラッキングコードをコピーしてテストページのhtmlファイル内の```</head>```前に追記しましょう。

![スクリーンショット 2020-09-19 9.27.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392066/f4234a91-162f-7678-0810-3b8bb32f17e6.png)

```:テストページのサンプル例
[root@vagrant vagrant]# cat /var/www/html/test.html
<head>
    <title>テストページ</title>
<!-- Matomo -->
<script type="text/javascript">
  var _paq = window._paq = window._paq || [];
  /* tracker methods like "setCustomDimension" should be called before "trackPageView" */
  _paq.push(['trackPageView']);
  _paq.push(['enableLinkTracking']);
  (function() {
    var u="//192.168.22.11/matomo/";
    _paq.push(['setTrackerUrl', u+'matomo.php']);
    _paq.push(['setSiteId', '1']);
    var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
    g.type='text/javascript'; g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
  })();
</script>
<!-- End Matomo Code -->
</head>

<body>
    ここはテストページです
</body>
```

### 設定完了、ログイン

以上で初期設定完了したので、ログインします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392066/e2a8b4d7-cba1-9cf2-3b88-df907feccd99.png)

ログインすると、まだ何もアクセスがないので以下のような画面が出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392066/7907c480-7222-442c-13cf-8e3297ff05e1.png)

なので、テストページに何度かアクセスしてからMatomo画面を開くと、以下のようにアクセス結果が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392066/ed80154d-d163-fc94-d80d-84015d44f60d.png)

ビジター(アクセスした人)のプロフィールなど、細かく見ることができてますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392066/dd59cbaf-4b38-830f-b4a6-4f0483b589a3.png)

# アクセスログをインポートしてログ解析を行う

ようやく今回メインとなるお話です。
上記の通り、トラッキングタグをウェブサイトに追加することで詳細なアクセス解析を行えますが、ウェブページに手を加えたくない場合もありますので、アクセスログをインポートしてログ解析する方法を紹介します。

## 1.ウェブサイトを追加する

右上の**歯車アイコン**より設定画面が開けますので、そこから左カラムの**ウェブサイト**→**管理**を開きます。
すると、アクセス解析ウェブサイト一覧が表示されますので、**新規の測定対象を追加**をクリックします。
「何を測定しますか？」とポップアップが出るので、**イントラネットのウェブサイト**をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392066/94e3b451-b2a3-85b1-e150-7838d25eaa06.png)

適当に入力し、下の方にある**保存**をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392066/ffd0a5c0-6895-8252-f546-04b3c71b60c9.png)

追加されたら、**ログ解析したいサイトのID**をチェックします、ここでは**2**です。
サイトのIDが、アクセスログをインポートする際に必要なパラメータになりますので、控えておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392066/c0dad8a5-a60c-9cf1-4445-b41fc035a8b3.png)

## 2.アクセスログを用意する

アクセス解析したいログを用意します。
簡単に手に入るのはMatomoを立てたサーバの```/var/log/httpd/access.log```になりますが、微々たるものです。
ダミーログを使いたい場合は[こちらのapache_log_gen](https://github.com/tamtam180/apache_log_gen)を活用すると良いかと思います。

```
[vagrant@vagrant ~]$ apache-loggen --rate=10 --limit=1000 dummy.log 
[vagrant@vagrant ~]$ tail dummy.log 
32.174.60.45 - - [20/Sep/2020:12:33:56 +0900] "GET /category/software HTTP/1.1" 200 114 "/item/music/2709" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.1) Gecko/20100101 Firefox/10.0.1"
72.63.224.197 - - [20/Sep/2020:12:33:56 +0900] "GET /item/garden/1651 HTTP/1.1" 200 59 "/search/?c=Electronics+Games" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"
144.81.38.39 - - [20/Sep/2020:12:33:56 +0900] "GET /category/electronics HTTP/1.1" 200 73 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"
36.105.151.60 - - [20/Sep/2020:12:33:56 +0900] "GET /category/electronics HTTP/1.1" 200 123 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; YTB730; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C)"
144.228.46.58 - - [20/Sep/2020:12:33:56 +0900] "POST /search/?c=Electronics HTTP/1.1" 200 41 "-" "Mozilla/5.0 (Windows NT 6.0; rv:10.0.1) Gecko/20100101 Firefox/10.0.1"
180.192.126.84 - - [20/Sep/2020:12:33:56 +0900] "GET /item/games/1485 HTTP/1.1" 200 53 "/category/electronics" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"
200.87.47.53 - - [20/Sep/2020:12:33:56 +0900] "GET /item/games/4095 HTTP/1.1" 200 73 "/item/electronics/15" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
72.159.93.161 - - [20/Sep/2020:12:33:57 +0900] "GET /category/sports HTTP/1.1" 200 46 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0.1) Gecko/20100101 Firefox/9.0.1"
124.129.149.37 - - [20/Sep/2020:12:33:57 +0900] "GET /item/garden/1812 HTTP/1.1" 200 111 "/category/games" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.1) Gecko/20100101 Firefox/10.0.1"
76.162.77.85 - - [20/Sep/2020:12:33:57 +0900] "GET /item/electronics/3862 HTTP/1.1" 200 56 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; YTB720; GTB7.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"
```

CentOS7上で動かす場合はRuby環境が必要になりますので、利用する場合はRubyをインストールしてください。
なお、上のVagrantfileではapache_log_genもちゃっかりインストールしてます。

## 3.アクセスログをMatomoにインポートする

Matomoへインポートする際は、Matomoディレクトリ内の```misc/log-analytics/import_logs.py```を用います。
実行する際は、以下を指定する必要があります。

- --url：MatomoのURL
- --idsite：インポートするログのサイトID
- ログファイル名

ちなみに```--idsite```はログ内からホストが分かる場合は指定不要ですが、特定できなかった場合は```--idsite```つけろとエラーが出るので設定推奨です。

その他、特定のリクエストを除くオプションもありますので、詳細は以下のURLを参照してみてください。

- [ログ解析ツールの使い方](https://matomo.jp/%E6%A9%9F%E8%83%BD%E8%AA%AC%E6%98%8E/4293#02)
- [↑の英語版](https://matomo.org/docs/log-analytics-tool-how-to/#differences-using-log-analytics-vs-using-javascript-client)

そんなわけで、先程作成したIDサイト2に対して、アクセスログをインポートしてみます。
実行すると、数秒ごとに読み込み結果が出力し、終了するとサマリが表示されます。

```
[root@vagrant log-analytics]# python /var/www/html/matomo/misc/log-analytics/import_logs.py ~
  --url=http://localhost/matomo/ --idsite=2 /var/log/httpd/access_log-20200920 
0 lines parsed, 0 lines recorded, 0 records/sec (avg), 0 records/sec (current)
Parsing log /var/log/httpd/access_log-20200920...
624 lines parsed, 200 lines recorded, 199 records/sec (avg), 200 records/sec (current)
624 lines parsed, 531 lines recorded, 265 records/sec (avg), 331 records/sec (current)

Logs import summary
-------------------

    531 requests imported successfully
    0 requests were downloads
    93 requests ignored:
        1 HTTP errors
        9 HTTP redirects
        0 invalid log lines
        0 filtered log lines
        0 requests did not match any known site
        0 requests did not match any --hostname
        0 requests done by bots, search engines...
        83 requests to static resources (css, js, images, ico, ttf...)
        0 requests to file downloads did not match any --download-extensions

Website import summary
----------------------

    531 requests imported to 1 sites
        1 sites already existed
        0 sites were created:

    0 distinct hostnames did not match any existing site:



Performance summary
-------------------

    Total time: 2 seconds
    Requests imported per second: 257.75 requests per second

Processing your log data
------------------------

    In order for your logs to be processed by Matomo, you may need to run the following command:
     ./console core:archive --force-all-websites --force-all-periods=315576000 --force-date-last-n=1000 --url='http://192.168.22.11/matomo/'
```

Matomo画面を開くとインポートされていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392066/0b323662-58ae-613c-6042-a130d1ece694.png)

なお、ビジター情報を見ると、不明(言語情報)やUnknown(モニタ情報)と表示されてます。
**トラッキングタグと比べ取得できる情報が少ないこと**がわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392066/0add2e15-f58f-5cde-4a92-215f621425eb.png)

今回は手動でログをインポートしましたが、cronやrsyncを利用して
対象サーバのログを転送、ログのインポートまで日次で自動実行すれば定期的にログ解析結果を出すことができます。

# おまけ(goaccessの紹介)

ここまで作り込まれたものではなく、もっとサクッとレポートでみたい場合は**goaccess**がおすすめです。
yumでサクッとインストールできますし、CLI上やHTMLファイル生成もできてお手軽です。

```:goaccessのインストール
[root@vagrant vagrant]# yum install goaccess
~~
Installed:
  goaccess.x86_64 0:1.3-1.el7                                                                                           

Dependency Installed:
  GeoIP.x86_64 0:1.5.0-14.el7        geoipupdate.x86_64 0:2.5.0-1.el7        tokyocabinet.x86_64 0:1.4.48-3.el7 
```

実行もお手軽です、初めにフォーマットを聞かれるかと思いますが、
ApacheならNCSAで問題ないです。

```:goaccessの実行(CLI上での表示)
[root@vagrant vagrant]# goaccess /var/log/httpd/access_log-20200920
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392066/38c29326-c60d-ad87-bd19-04b0e9f29cb6.png)
HTMLファイルに出力すると、以下のように表示することもできます。
※ここでは詳細は載せませんのでぐぐってみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392066/58ca69a8-1282-df5e-c151-c2e5cf1a36c3.png)

# おわりに

気づいたらこの下書きが半年ぐらい放置しちゃっていたので急いで書きました。
インポートしたログを特定期間削除する方法などもありますので、合間を見て追記していきたいと思います。

# 参考文献

- [Matomo 公式](https://matomo.org/)
- [Matomo JA](https://matomo.jp/)
- [ログ解析ツールの使い方](https://matomo.jp/%E6%A9%9F%E8%83%BD%E8%AA%AC%E6%98%8E/4293#02)
- [CentOS 6.9の上でapache-loggen使いたくてゴタゴタした。](https://atsuizo.hatenadiary.jp/entry/2018/02/07/0900000)
- [Linuxメモ : GoAccessでリアルタイムにWebログ解析](https://wonderwall.hatenablog.com/entry/2017/08/27/183000)