python3にてアクセスログから各パラメータを抽出する方法について
python3にて以下スクリプトを作成したのですが、タイムスタンプが重複した際に、辞書型だと抽出することができないので、リスト型にしてタイムスタンプが重複する際もすべて抽出したいです。
簡単に行う方法はないでしょうか。
宜しくお願い致します。
import os
import csv
from collections import defaultdict
def logparser(filepath):
""" ログファイルからデータを抽出 """
datastore = defaultdict(dict)
with open(filepath) as f:
for textline in f.readlines():
try:
textline = textline.rstrip('\n')
items = textline.split()
timestamp = textline[:23]
datastore[timestamp]['タイムスタンプ'] = timestamp
if items[-2] == 'INFO:':
datastore[timestamp]['リクエスト内容'] = textline.split('INFO: ')[1]
if 'rcmd_type' in items:
datastore[timestamp]['rcmd_type'] = textline.split('rcmd_type = ')[1]
if 'priors:' in items:
datastore[timestamp]['priors'] = textline.split('priors: ')[1]
if ' num=' in textline:
datastore[timestamp]['num'] = textline.split(' num=')[1].split()[0]
if ' rcmds=' in textline:
datastore[timestamp]['rcmds'] = textline.split(' rcmds=')[1].split()[0]
if ' backfill=' in textline:
datastore[timestamp]['backfill'] = textline.split('
except:
pass
return datastore
def export2csv(data, filename):
""" csv形式で出力 """
header = ['タイムスタンプ', 'リクエスト内容', 'rcmd_type', 'priors', 'num', 'rcmds', 'backfill']
filename = f'{filename}.csv'
with open(filename, 'w') as f:
csv.writer(f, lineterminator='\n').writerow(header)
with open(filename, 'a') as f:
for record in data.items():
record = [record[1].get(h) for h in header]
csv.writer(f, lineterminator='\n').writerow(record)
if __name__ == '__main__':
""" 抽出からファイル出力までの一連の処理 """
filepath = './log.txt' # 任意のパスに変更してください
filename, extention = os.path.splitext(filepath)
data = logparser(filepath)
export2csv(data, filename)