test.logというApacheのアクセスログをCSVファイルに変換する方法です。
ここを参考にしています。
http://www.atmarkit.co.jp/ait/articles/1307/11/news009_3.html
変換後のファイルはtest.csvにします。
test.logの内容
127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326 127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326
デフォルトのアクセスログですね。
import re fr = open('test.log') fw = open('test.csv', 'w') line = fr.readline() while line: fline = re.sub(r'^(\S+) (\S+) (\S+) \[([^\]]+)\] "([A-Z]+) ([^ "]+)? HTTP/[0-9.]+" ([0-9]{3}) ([0-9]+|-)', r'\1,\2,\3,\4,\5,\6,\7,\8', line) fw.write(fline) line = fr.readline() fr.close() fw.close()
ファイルのデータを一行ずつ読み込んで正規表現のsub関数を使ってログを
8つのパートに分割しcsv形式で書き込んでいます。
正規表現の部分がなかなか慣れていないので悩むところです。
ログの項目を増やした時のメモ。
■sample accesslog 127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326 ↓↓↓ fline = re.sub(r'^(\S+) (\S+) (\S+) \[([^\]]+)\] "([A-Z]+) ([^ "]+)? HTTP/[0-9.]+" ([0-9]{3}) ([0-9]+|-)', r'\1,\2,\3,\4,\5,\6,\7,\8', line) ■refererとuser agentを追加したとき 222.31.3.3 - frank [10/Oct/2000:13:55:36 -0700] "GET /index.html HTTP/1.0" 200 2326 "http://jbclub.xii.jp/" "Mozilla/5.0 (Linux; U; Android 4.2.2; ja-jp; SO-04E Build/10.3.1.B.0.256) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30" ↓↓↓ fline = re.sub(r'^(\S+) (\S+) (\S+) \[([^\]]+)\] "([A-Z]+) ([^ "]+)? HTTP/[0-9.]+" ([0-9]{3}) ([0-9]+|-) "([^\"]*)" "([^\"]*)"', r'\1,\2,\3,\4,\5,\6,\7,\8,\9,\10', line)
refererとuser agentを追加したときは”([^\”]*)”を単純に2個追加しました。
これで一旦はできました。
以上