繁体   English   中英

如何使用python使用hadoop处理apache日志文件

[英]How to process a apache log file with hadoop using python

我是hadoop的新手,无法很好地理解这个概念,我遵循以下过程

  1. 通过查看此处安装了Hadoop

  2. 通过查看此处的 worcount示例和在Python中正常工作,尝试了本教程中的基本示例。

实际上我正在尝试做/我得到的要求是使用以下格式的python使用hadoop处理位于/var/log/httpd fedora(linux)中的apache日志文件

IP address    Count of IP   Pages accessed by IP address

我知道apache日志文件有两种

  1. access_logs

  2. error_logs

但是我真的无法理解apache日志文件的格式。

我的Apache日志文件内容如下所示

::1 - - [29/Oct/2012:15:20:15 +0530] "GET /phpMyAdmin/ HTTP/1.1" 200 6961 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.77 Safari/537.1"
::1 - - [29/Oct/2012:15:20:16 +0530] "GET /phpMyAdmin/js/cross_framing_protection.js?ts=1336063073 HTTP/1.1" 200 331 "http://localhost/phpMyAdmin/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.77 Safari/537.1"
::1 - - [29/Oct/2012:15:20:16 +0530] "GET /phpMyAdmin/js/jquery/jquery-1.6.2.js?ts=1336063073 HTTP/1.1" 200 92285 "http://localhost/phpMyAdmin/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.77 Safari/537.1"

谁能解释一下上面/ apache日志文件的结构

我对如何处理数据IP地址,IP地址数,IP地址访问的页面的日志文件感到困惑

谁能让我知道我们如何使用python和以上信息使用haddop处理apache日志文件,并将结果存储为上述格式

任何人都可以用python提供基本代码来处理上述格式的apache日志文件,以便我能实时了解如何使用python代码处理文件并根据需要扩展它们

这只是部分答案,但我希望您会发现它有用,如果您需要更具体的内容,请使用您的代码和遇到的具体问题更新您的问题。

文件处理的东西

Python文档很好地解释了文件处理。

如果您想实时监视日志文件(我想这就是您的问题的意思……),请在此处查看此问题 它还与监视日志文件有关。 我不太喜欢接受的答案,但是有很多不错的建议。

行处理的东西

一旦您设法从日志文件中获取单独的行,则需要对其进行处理。 它们只是字符串,只要您知道格式就非常简单。 我再次参考python docs 如果您想做任何激烈的事情,您可能需要检查一下。

现在给出给定的行格式:

编辑给出的日志行的实际格式,我们现在可以取得进展...

因此,如果您从日志文件中抓取一行,例如:

line = '::1 - - [29/Oct/2012:15:20:15 +0530] "GET /phpMyAdmin/ HTTP/1.1" 200 6961 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.77 Safari/537.1"'

第一步是将其分成不同的部分。 我利用以下事实:日期和时间用“ [...]”括起来

lElements = line.split('[')
lElements = lElements[0] + lElements[1].split(']')

这给我们留下了:

lElements[0] = '::1 - - ' #IPv6 localhost = ::1
lElements[1] = '29/Oct/2012:15:20:15 +0530'
lElements[2] = ' "GET /phpMyAdmin/ HTTP/1.1" 200 6961 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.77 Safari/537.1"'

date元素可以转换为更友好的格式

“ url”元素包含有关实际请求的内容(HTTP动词,HTTP版本,一个神秘数字和一堆用户代理内容)。

编辑添加代码以获取URL和IP地址。 忽略时间的东西

ip_address = lElements[0].split('-')[0] # I'm just throwing away those dashes. are they important?
http_info = lElements[2].split('"')[1] # = 'GET /phpMyAdmin/ HTTP/1.1'
url = http_info.split()[1]  # = '/phpMyAdmin/'

"""
so now we have the ip address and the url. the next bit of code updates a dictionary dAccessCount as the number of url accesses increases...
dAccessCount should be set to {} initially
"""

if ip_address in dAccessCount:
    if url in dAccessCount[ip_address]:
        dAccessCount[ip_address][url]+=1
    else:
        dAccessCount[ip_address][url]=1
else:
    dAccessCount[ip_address] = {url:1}

因此,dAccessCount的键是已访问任何URL的所有IP地址,而dAccessCount [some_ip_address]的键是ip_address已访问的所有URL,最后:dAccessCount [some_ip_address] [some_url] =次数从some_ip_address访问some_url。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM