通过参数解析 Apache 日志中的 GET 请求


Parse GET requests in Apache log by arguments

我有一组广泛的Apache日志,我希望解析。具体来说,有一个在站点上运行的 PHP 脚本,该脚本将参数传递给数据库以向公众过滤结果。这个名为"searchbox.php"的脚本传递了三个参数(在其 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 请求中,我只需要一种干净的方式来从这些大型日志文件中提取这三位信息并将其转储到 CSV 或制表符分隔文件中。

我想这将在PHP中完成,但我也会娱乐Python。

你可以使用正则表达式...

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")

因此,假设您知道如何逐行读取文件,则可以使用 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 来解析日志。 取决于您的经验和环境。