我有一大堆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。
答案 0 :(得分: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")
答案 1 :(得分:0)
因此,假设您知道如何逐行读取文件,您可以使用explode()将行拆分为数组,然后继续爆炸数组中的元素,直到达到您想要的位置。 / p>
$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来解析日志。取决于您的经验和环境。