本文的作者是 nikolay koldunov,本文原文是apache log analysis with pandas
注本文的圖有問題,沒法引用,還是去原文看下,這裡作為乙個引子。
%pylab inline
我們將需要 apachelog 模組,用來解析日誌。我們也需要知道設定在 apache 配置中的日誌格式。在我的案例中,我沒有訪問 apache 配置,但是主機託管服務提供商在他的幫助頁提供了日誌格式的描述。下面是它自己的格式以及每個元素的簡單描述:
format = r'%v %h %l %u %t \"%r\" %>s %b \"%i\" \"%i\" %t'
%v - 根據 usecanonicalname 設定的伺服器名字
%h - 遠端主機(客戶端 ip)
%l - identity of the user determined by identd (not usually used since not reliable)
%u - 由 http authentication 決定的 user name
%t - 伺服器完成處理這個請求的時間
%r - 來自客戶端的請求行。 ("get / http/1.0")
%>s - 伺服器端返回給客戶端的狀態碼(200, 404 等等。)
%b - 響應給客戶端的響應報文大小 (in bytes)
\"%i\" - referer is the page that linked to this url.
user-agent - the browser identification string
%t - apache 請求時間
in [3]:import apachelog, sys
設定格式:
in [4]:fformat = r'%v %h %l %u %t \"%r\" %>s %b \"%i\" \"%i\" %t'
建立乙個解析器:
in [5]:p = apachelog.parser(fformat)
簡單字串:
in [7]:data = p.parse(sample_string)
in [8]:data
out[8]:i0
2000
www.oceanographers.ru
26126
109.165.31.156--
get /index.php?option=com_content&task=section...
16/mar/2013 08:00:25 +0400
-mozilla/5.0 (windows nt 6.1; rv:19.0) gecko/20...
1200
0www.oceanographers.ru
10532
109.165.31.156
-get /templates/ja_procyon/css/template_css.css...
16/mar/2013 08:00:25 +0400
-mozilla/5.0 (windows nt 6.1; rv:19.0) gecko/20...
我們不準備使用所有的資料,因此讓我們刪除一些列:
del df['%t']; del df['%v']; del df['%i']; del df['%l']; del df['%u']; del df['%i']
並且把這些列重新命名**類可理解的格式:
df = df.rename(columns=)
結果資料幀的前 5 行:
轉換時間列成 datetime 格式並做乙個索引出來(pop 將丟棄原始的 time 列):
df.index = pd.to_datetime(df.pop('time'))
status 變數是乙個 string 型別,因此我們需要把它轉換成 int:
df['status'] = df['status'].astype('int')
一些 b 列的行包含 '-' 字元,我們需要使用 astype 轉換它們:
df['b'][93]
out[19]:
'-'
我們可以為該列使用乙個通用的函式,它們將把所有的破折號轉換成 nan,並且剩餘的轉換成 floats,另外把 bytes 轉換成 megabytes:
def dash2nan(x):
if x == '-':
x = np.nan
else:
x = float(x)/1048576.
return x
我相信有乙個更優雅的方式來做到這一點。
df['b'].plot()
但是實際上你想知道的第一件事是你的**有多少的訪問量,以及它們的時間分布。我們從 b 變數的 5 分鐘間隔重新取樣,並計算每個時間跨度的請求數。實際上,在這個示例中不管我們使用哪個變數,這些數字將表明有多少次請求該**的資訊請求。
df_s = df['b'].resample('5t', how='count')
df_s.plot()
out[23]:
![此處輸入的描述][8]
我們不僅僅計算每個時間的請求數,也計算每個時間段的總流量:
df_b = df['b'].resample('10t', how=['count','sum'])
df_b['count'].plot( color='r')
legend()
df_b['sum'].plot(secondary_y=true)
out[24]:
![此處輸入的描述][9]
df_b.corr()
|-| count| sum
|count| 1.000000| 0.512629
|sum| 0.512629| 1.000000
我們可以仔細看下早高峰:
df_b['2013-03-16 6:00':'2013-03-16 10:00']['sum'].plot()
out[26]:
![此處輸入的描述][10]
看起來流量峰值是由乙個請求引起的。讓我們找出這個請求。選擇所有響應大於 20 mb 的請求:
這是一本書的 pdf 檔案,這就解釋了在 2013-03-16 09:02:59 的流量出口峰值。
cc = df[df['b']<20]
cc.b.hist(bins=10)
out[28]:
![此處輸入的描述][11]
因此,大部分的檔案是小於 0.5 mb。實際上它們甚至更小:
cc = df[df['b']<0.3]
cc.b.hist(bins=100)
out[29]:
![此處輸入的描述][12] 資料分析 pandas操作使用
一 使用指引 1.資料型別series 1.1構建 a.python列表直接構建 b.通過numpy的 ndarray構建 c.通過字典構建1.2索引 a.取單個資料 b.取連續的多個資料 c.取不連續多個資料 d.根據條件取值 布林索引 2.資料型別dataframe 2.1構建 a.巢狀的列表 ...
elk系列7之通過grok分析apache日誌
preface 說道分析日誌,我們知道的採集方式有2種 通過grok在logstash的filter裡面過濾匹配。logstash redis python py指令碼過濾匹配 es 第一種方式是不怎麼推薦使用的,除非是在日誌量比較小的場景才推薦使用。因為grok非常影響效能的,且不夠靈活,除非你很...
資料分析 pandas
pandas是乙個強大的python資料分析的工具包,它是基於numpy構建的,正因pandas的出現,讓python語言也成為使用最廣泛而且強大的資料分析環境之一。pandas的主要功能 具備對其功能的資料結構dataframe,series 整合時間序列功能 提供豐富的數 算和操作 靈活處理缺失...