アジェンダ
ELBからのアクセスログしか取れないよね
前回アクセスログをredshiftに送信した。
現構成ではCloudFront+ALB+EC2という状態なので、あのままではアクセス元のIPが所得できない。
なのでh2oのログフォーマットを少しいじることに。
h2oのログフォーマットを加工する
h2oのaccess-logのformatにはこんな感じで書いておく。
format: "remote_address:%h\tremote_logname:%l\tremote_user:%u\trequest_time:%{%Y-%m-%d %H:%M:%S}t\trequest_line:\"%r\"\tstatus_code:%s\tsize_of_the_response_body:%b\tuser_agent:\"%{User-agent}i\"\treferer:\"%{Referer}i\"\tforwarded:\"%{X-Forwarded-For}i\"\tproto:\"%{X-Forwarded-Proto}i\""
これでOK
HTTPしか許可してない構成なのでちょっと変える
プロトコルまでログに残しておく必要はないので変えてみた。
access-log: path: "/var/log/h2o/access.log" format: "remote_address:%h\tremote_logname:%l\tremote_user:%u\trequest_time:%{%Y-%m-%d %H:%M:%S}t\trequest_line:\"%r\"\tstatus_code:%s\tsize_of_the_response_body:%b\tuser_agent:\"%{User-agent}i\"\tforwarded:\"%{X-Forwarded-For}i\"\treferer:\"%{Referer}i\""
ログ取れた
/var/log/h2o/access.logで確認。
remote_address:xxx.xxx.xxx.xxx remote_logname:- remote_user:- request_time:2017-08-10 12:14:45 request_line:"GET /contact.html HTTP/1.1" status_code:304 size_of_the_response_body:0 user_agent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.<OS build number>" forwarded:"xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx" referer:"https://tatoebakimigakizutuite.com/"
redshiftのテーブルも変える
前の記事を参考にテーブルのカラムを変えておく。
redashるぜ
クエリを書く。
- アクセス元のIPを引っ張る
SELECT split_part(split_part(forwarded, '"', 2), ',' , 1), COUNT(*) AS COUNT FROM access_log group by forwarded limit 10;
- ユーザエージェント
SELECT user_agent, COUNT(*) AS COUNT FROM access_log group by user_agent limit 10;
- リファラー
SELECT referer, COUNT(*) AS COUNT FROM access_log group by referer limit 10;
グラフ
まとめ
一度うまく行けば変更があっても割りとすぐ対応できる。
面白いねredash!