0

我有一组要解析的 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。

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

因此,假设您知道如何逐行读取文件,您可以使用 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 回答