paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

Privoxyのアクセス集計とTacoBellプログラミング

自宅の環境で検証なんかやってると作ってそのまんま、みたいなの出てきますよね。

昔作ったプロキシサーバのアクセスログをそろそろ集計してみたいと思います。
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

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