Skip to content

Instantly share code, notes, and snippets.

@kemsakurai
Created May 22, 2018 15:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kemsakurai/518f2688a8a3e40755715f3c38fc338a to your computer and use it in GitHub Desktop.
Save kemsakurai/518f2688a8a3e40755715f3c38fc338a to your computer and use it in GitHub Desktop.
Apache アクセスログを、pandas 経由 で RDB に登録する
from django.core.management.base import BaseCommand
from django.conf import settings
import pandas as pd
import sqlite3
# ファイルの場所
PATH = settings.BASE_DIR + '/input/logs/ssl_access_log'
# DATABASE_PATH
DATABASE_PATH = settings.BASE_DIR + '/output/sqlite/superset_adapter.db'
class Command(BaseCommand):
help = "Collect Access Log."
def handle(self, *args, **options):
# column定義 して、読み込み
data = pd.read_csv(PATH, sep=' ', header=None, usecols=[0, 3, 4, 5, 6, 7, 8, 9, 10, 11],
names=['ip', 'datetime', 'timezone', 'request', 'status', 'size', 'referer', 'user_agent',
'user_id', 'client_id']
, na_values=['-'])
# request カラムを分割
data[['http_method', 'path', 'protocol']] = data['request'].str.split(' ', expand=True)
# 時刻列parse
datetime_str = data.datetime + data.timezone
time_trimmed = datetime_str.map(lambda s: s.strip('[]').split('+')[0])
data['datetime'] = pd.to_datetime(time_trimmed, format='%d/%b/%Y:%H:%M:%S')
# カラムを削除
del data['timezone']
# dbコネクト
conn = sqlite3.connect(DATABASE_PATH)
# tableを作成する
data.to_sql("http_server_access_log", conn, index=False, if_exists="replace")
# コネクションを閉じる
conn.close()

前提

  • アクセスログは、サーバーにとりにいったりしないので、事前に取得しておく。
  • ログが、BASE_DIR 配下のディレクトリにある前提で動作する。
  • pandas のインストールが必要。

説明

  • アクセスログのフォーマットで、時刻とタイムゾーンが分かれていたので、結合してpythonの datatime に変換する。
  • http_method、path、protocol のカラム値を、ログ内の、request をスペースで区切って作成する。
  • RDB登録時に、pandas のindex は登録しない。データ更新時は、DELETE ALL、INSERT ALL で動作する。

参考

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment