0

解析しようとしている Apache ログの広範なセットがあります。具体的には、サイトで実行される PHP スクリプトがあり、データベースに引数を渡して結果をフィルター処理し、一般に公開します。「searchbox.php」と呼ばれるこのスクリプトは、結果に関心のある 3 つの引数を (その URL で) 渡します。

  • エンジン
  • クエリ
  • サブエンジン

残りの情報は、現時点では私にとって価値がありません。単一のログ エントリの形式は次のとおりです。

sub.domain.com 123.456.789.456 - - [28/Jun/2012:00:04:00 -0500] "GET /sitescripts/search-box/searchbox.php?engine=catalog-vs-worldcat&query=law+enforcement+articles&x=0&y=0&subengine=iiikw HTTP/1.1" 302 20 "http://sub.domain.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:12.0) Gecko/20100101 Firefox/12.0" - 0

必要な情報は GET リクエストにあります。これらの 3 ビットの情報をこれらの大きなログ ファイルから取り出して、CSV またはタブ区切りファイルにダンプするクリーンな方法が必要なだけです。

これは PHP で行われると思いますが、Python も楽しませます。

4

2 に答える 2

2

正規表現を使用できます...

re_str = r"\?engine=(?P<eng>[\w-]*?)&query=(?P<query>[=\d\+\w-]*?)&subegine=(?P<sub>\w*)\s"
reg = re.compile(re_str)
for line in file:
  m = reg.search(line)
  print "Engine", m.group("eng")
  print "Query", m.group("query")
  print "Sub", m.group("sub")
于 2012-06-29T20:55:36.127 に答える
0

したがって、ファイルを 1 行ずつ読み取る方法を知っていると仮定すると、explode() を使用して行を配列に分割し、目的の場所に到達するまで配列内の要素を分解し続けることができます。

$line_parts = explode(" ", $line_you_read_from_log);
$url = $line_parts[6];
// /sitescripts/search-box/searchbox.php?engine=catalog-vs-worldcat&query=law+enforcement+articles&x=0&y=0&subengine=iiikw
$url_parts = explode("?", $url);
$query = $url_parts[1];
// engine=catalog-vs-worldcat&query=law+enforcement+articles&x=0&y=0&subengine=iiikw
$pairs = explode("&", $query);
// and so on and so on...

正規表現も別の選択肢ですが、長く見続けると複雑になり、気が狂ってしまう可能性があります。

bash では、sed と awk を使用してログを解析できます。ご経験や環境により異なります。

于 2012-06-29T20:32:31.213 に答える