経緯
現在私は、SEOライティングツールを開発する株式会社EXIDEAで、インターン生としてアプリのログ分析に携わっています。そこで多くのログデータを jupyternotebook でPandasのデータフレームに入れてきました。
しかしその中で、その手法についてシンプルに書かれている記事がないことに気がつきました。
どんなに分析を行いたくても、ログデータをpandasに入れなければ、何も始まりません。
なので、今回は生のログデータを用いて、実際に説明してみよう思います。
では早速見ていきましょう!!
#方法(2ステップ)
・コマンドで欲しい情報をテキストファイルにまとめる
・pd.read_csv() でテキストファイルをデータフレームに格納する
今回使うログデータ
サンプルとして、Nginxのアクセスログを使用します。
172.17.x.xxx - - [23/Jun/2020:06:25:18 +0900] "GET /xxxxx.js HTTP/1.1" 200 5032 "http://example.net/" "Mozilla/5.0 (iPhone; CPU iPhone OS 13_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) GSA/112.0.316532311 Mobile/15E148 Safari/604.1" "203.0.113.195"
172.17.x.xx - - [23/Jun/2020:06:25:18 +0900] "GET /xxxxx.js HTTP/1.1" 304 0 "http://example.net/" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 YJApp-IOS jp.co.yahoo.ipn.appli/4.16.14" "203.0.113.195"
172.17.x.xxx - - [23/Jun/2020:06:25:18 +0900] "GET /xxxxx.js HTTP/1.1" 304 0 "http://example.net/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36" "203.0.113.195"
#ステップ1
コマンドで欲しい情報をテキストファイルにまとめる
この操作では、 主にsed,awkコマンドを使用します。
流れとしては、
1.sed コマンドを使って、ログデータの前処理をする(置換)
2.awk コマンドで欲しいフィールドを抽出する
###sed コマンドの処理
WhiskyWhiskyWhisky
基本的な文法
$ sed 's/置換元/置換後/g'
ex)
$sed 's/Whisky/Beer/g' test.txt
>>>BeerBeerBeer
これで必要のない文字を空白文字で置換を行ったりして、ログデータを整形します。
今回だと [], "" はPandasでデータフレームに入れる時に邪魔になるので、前もって処理しておきます。
###awk コマンドの処理
apple orange grape banana
基本的な文法
$ awk '{print 欲しいフィールド}'
ex)#1列目と3列目が欲しい
$ awk '{print $1,$3}' test.txt
>>> apple grape
今回は、IPアドレス,時刻,リクエスト,パス,ステータスコード,refererが欲しいので
1,4,6,7,11列目を抽出します。
###実際の今回のコマンド
コマンドの処理をまとめたものが以下のコードです。
cat access.log | sed 's/\[//g' -e 's/\]//g' -e 's/"//g' | awk '{print $1,$4,$6,$7,$11}' > test.txt
####流れ
・最初にcatコマンドでaccess.logを開きます。
(各コマンドを一回で実行したいときは、| で繋ぎます。)
・その後、sedコマンドで[]と""を除きます。
(sedコマンドは-eと書くことで連続して置換ができます)
・次に、awkコマンドで欲しいフィールドを抽出
・最後はそれらの変形をしたaccess.logをtest.txtに変換
###コマンドの実行結果
172.17.x.xxx 23/Jun/2020:06:25:18 GET /xxxxx.js 200 http://example.net/
172.17.x.xx 23/Jun/2020:06:25:18 GET /xxxxx.js 304 http://example.net/
172.17.x.xxx 23/Jun/2020:06:25:18 GET /xxxxx.js 304 http://example.net/
#ステップ2
pd.read_csv() でテキストファイルをデータフレームに格納する
今までの処理で、ログデータが欲しい情報だけが入ったテキストファイルになりました。
ここからは一発で終わります。
import pandas as pd
columns=["IP","Datetime","method","URI","status","referer"]
df = pd.read_csv('test.txt',delimiter=' ',names=columns) #区切り文字は空白
この後、さらに前処理をしていくことで、時系列分析などを行うことができます。
#最後に
今回この記事で紹介した方法は、僕個人が一番やりやすかったやり方です。なので、もしもっと簡単な方法がありましたら、コメント欄の方で教えていただけると幸いです。