自宅の環境で検証なんかやってると作ってそのまんま、みたいなの出てきますよね。
昔作ったプロキシサーバのアクセスログをそろそろ集計してみたいと思います。
1年以上ほったらかしてしまいました。
WSLでProxyサーバを有効にしてみる - paloma blog
環境
Windows10 メイン機です。
サブ機と同じですね。
PS C:\Users\tsuru> Get-WmiObject Win32_OperatingSystem SystemDirectory : C:\WINDOWS\system32 Organization : BuildNumber : 17763 RegisteredUser : SerialNumber : 00326-10000-00000-AA205 Version : 10.0.17763
- WSL側
masashi@DESKTOP-986MNSO:~$ uname -a ; cat /etc/lsb-release Linux DESKTOP-986MNSO 4.4.0-17763-Microsoft #864-Microsoft Thu Nov 07 15:22:00 PST 2019 x86_64 x86_64 x86_64 GNU/Linux DISTRIB_ID=Ubuntu DISTRIB_RELEASE=16.04 DISTRIB_CODENAME=xenial DISTRIB_DESCRIPTION="Ubuntu 16.04.4 LTS"
プロキシを入れた目的は
- 広告ブロック
- アクセス先の傾向
- 変なURL踏んでないか
を確認したいというものでした。
それで何か可視化ツールでも使えばお洒落にアクセス解析できるじゃん!と思いながら
得に何もせず今まで経ってしまいました。
そんな中ある記事に出会って考えを改めました。
Taco Bell programmingとは
要約(自分なりの)
TacoBellは8種類の材料で大きな利益を出している。
プログラムの世界で考えたらどうなるか。
- シンプルで拡張性のある解決方法を考える
- 機能は資産だがコードは負債である
- Unixツールセットをうまく利用する
- 余計なツールはなるべく少なく
- トラブルが減る
なるほどなーですよね。
僕もpython覚えたての頃は何でも作っちゃえでしたが
何でもかんでもだとこのPrivoxyのように作りっぱなしの物がたくさん出てきそうです。
既存のものを最大限利用するのが大事ということですね。
という訳でほったらかしていたアクセスログの集計は
アプリケーション言語ではなくshell(WSL)で行おうと思います。
ログの集計
ログの形式
私の設定だとHTTPのアクセスログとPrivoxyの動作ログ?が出ています。
masashi@DESKTOP-986MNSO:~$ tail /var/log/privoxy/logfile 127.0.0.1 - - [07/Dec/2019:17:44:19 +0900] "CONNECT sync-756-us-west-2.sync.services.mozilla.com:443 HTTP/1.1" 200 10435 127.0.0.1 - - [07/Dec/2019:17:44:28 +0900] "CONNECT cdn-ak.f.st-hatena.com:443 HTTP/1.1" 200 497091 127.0.0.1 - - [07/Dec/2019:17:45:26 +0900] "CONNECT image.itmedia.co.jp:443 HTTP/1.1" 200 38641 127.0.0.1 - - [07/Dec/2019:17:46:00 +0900] "CONNECT firefox.settings.services.mozilla.com:443 HTTP/1.1" 200 819 127.0.0.1 - - [07/Dec/2019:17:46:05 +0900] "CONNECT webextensions.settings.services.mozilla.com:443 HTTP/1.1" 200 8814 127.0.0.1 - - [07/Dec/2019:17:46:17 +0900] "CONNECT fonts.gstatic.com:443 HTTP/1.1" 200 39237 2019-12-07 17:46:20.154 7f039fff0700 Request: safebrowsing.googleapis.com:443/ 127.0.0.1 - - [07/Dec/2019:17:46:20 +0900] "CONNECT translate.google.co.jp:443 HTTP/1.1" 200 365618 127.0.0.1 - - [07/Dec/2019:17:47:08 +0900] "CONNECT pbs.twimg.com:443 HTTP/1.1" 200 237636 2019-12-07 17:47:23.247 7f03df7e0700 Request: mail.google.com:443/
Privoxyのログフォーマットはよく理解できていませんが、
とりあえず今回はアクセスログのみ集計しようと思います。
最終的には月ごとに集計を出したいですが、今月分(まだ7日ですが)を一旦出してみます。
ログの日付は[07/Dec/2019:17:47:08 +0900]で出力されているので、年と月だけgrepしましょう。
$ date +%b/%Y Dec/2019
でOKですね。
ドメインの部分だけ抜き出したいので、
awk '{sub("\"", ""); print $7}'
を追加します。
今月の開始分をちょっと出します。
masashi@DESKTOP-986MNSO:~$ cat /var/log/privoxy/logfile | grep `date +%b/%Y` \ > | awk '{print $7}' | head www.netflix.com:443 r4---sn-uxjoxu-ioqz.googlevideo.com:443 www.netflix.com:443 r4---sn-uxjoxu-ioqz.googlevideo.com:443 abs.twimg.com:443 safebrowsing.googleapis.com:443 r4---sn-uxjoxu-ioqz.googlevideo.com:443 login.live.com:443 firefox.settings.services.mozilla.com:443 www.netflix.com:443
いい感じですね。
じゃあ12/1から今日の現時点までを集計してTOP10出してみましょう。
と思ったのですが、一旦HTTPとHTTPSを分けて集計します。
分けるのはログの出方が異なるため、ワンライナーでは難しかったからです。
HTTP
http://xx.xx.xx.com/yyyyy/zzzzみたいにURIのログが出ますので、
ドメインだけ取るようgrepでhttp://以降のURLをヒットさせた後、awkでpath以降をカットします。
uniqの前にsortしておかないと、飛び飛びの場合重複として計算されないため先に行います。
あとは集計した数字順になるように -nr で再sortします。
masashi@DESKTOP-986MNSO:~$ cat /var/log/privoxy/logfile | grep `date +%b/%Y` \ > | awk '{print $7}' \ > | grep -oP '//\K.\S.*' | awk -F "/" '{print $1}' \ > | sort | uniq -c | sort -nr | head 98 www.hatena.ne.jp 75 detectportal.firefox.com 40 ocsp.digicert.com 39 download.windowsupdate.com 34 61.26.74.214 31 go.microsoft.com 31 dmd.metaservices.microsoft.com 24 blog.hatena.ne.jp 19 ocsp.pki.goog 16 ocsp.sca1b.amazontrust.com
最近の主流はHTTPSですが、まだまだHTTPもありますね。
HTTPS
集計方法はhttpと同じです。
HTTPSはドメインしか取得できないので
先ほどのgrep部分からhttpを除外するだけです。
masashi@DESKTOP-986MNSO:~$ cat /var/log/privoxy/logfile | grep `date +%b/%Y` \ > | awk '{print $7}' | grep -v http \ > | sort | uniq -c | sort -nr | head 2191 www.netflix.com:443 551 firefox.settings.services.mozilla.com:443 495 pbs.twimg.com:443 479 abs.twimg.com:443 426 safebrowsing.googleapis.com:443 345 play.google.com:443 331 api.accounts.firefox.com:443 330 sync-756-us-west-2.sync.services.mozilla.com:443 284 webextensions.settings.services.mozilla.com:443 217 mail.google.com:443
まだ今月1週間ですが、さすがのNetflixですね。
ブラウザ関係のドメインも多いです。
むすび
というわけでshellを使ってアクセス集計してみました。
いつものpythonで作らなくても十分いい感じで集計できそうです。
shellは偉大ですね。
今回はコマンドでしたがスクリプト化してもう少しきれいに集計してみたいと思います。
また、アクセスログ以外もRequestとかBlockとかの情報が取れているので
Privoxyのログの勉強+集計もしてみようと思います。
おまけ
ログファイルのローテーションしていませんでした。
1年放置した割に少ないですが、200M近くあります。
これも対策しないと。
masashi@DESKTOP-986MNSO:~$ ls -lh /var/log/privoxy/logfile* -rw-r--r-- 1 Privoxy nogroup 194M Dec 7 18:59 /var/log/privoxy/logfile