使用 Pandas 分析 Apache 日誌

2021-06-28 02:29:50 字數 4923 閱讀 8989

本文的作者是 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 整合時間序列功能 提供豐富的數 算和操作 靈活處理缺失...