簡體   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