Pandas分析Nginx日志

安裝所需Python庫

$ pip install numpy pandas matplotlib

注:所有工作都在Python 3中實踐 (Python 2應該也沒有問題)

Nginx日志格式

$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"

注:Nginx 日志格式可以自己設置暂筝,根據(jù)日志格式修改下面的匹配正則表達式

分析日志

加載日志

#!/usr/bin/env python
# encoding: utf-8
from datetime import datetime
import pytz
import pandas as pd


def parse_str(s):
    """
    Return the string.

    Example:
    `>>> parse_str('[some string]')`
    `'some string'`
    """
    return s[1:-1]


def parse_datetime(date):
    """
    Return datetime.

    Parse datetime with timezone format as:
        `[day/month/year:hour:minute:second timezone]`

    Example:
    `>>> parse_datetime('17/Jan/2017:13:00:52 +0800')`
    `datetime.datetime(2017, 01, 17, 13, 00, 52, tzinfo=)`
    """
    dt = datetime.strptime(date[1:-7], '%d/%b/%Y:%H:%M:%S')
    dt_tz = int(date[-6:-3]) * 60 + int(date[-3:-1])
    return dt.replace(tzinfo=pytz.FixedOffset(dt_tz))


def load_csv(filename):
    df = pd.read_csv(
        filename,
        sep='\s(?=(?:[^"]*"[^"]*")*[^"]*$)(?![^\[]*\])',
        engine='python',
        na_values='-',
        header=None,
        usecols=[0, 3, 4, 5, 6, 7, 8],
        names=['remote_ip', 'date', 'request', 'status', 'size', 'referer', 'user_agent'],
        converters={
            'date': parse_datetime,
            'request': parse_str,
            'status': int,
            'size': int,
            'referer': parse_str,
            'user_agent': parse_str
        }
    )

    return df

訪問次數(shù)最多的IP地址

def top_remote_ip(df, n=5):
    remote_ip = df.groupby('remote_ip')['remote_ip'].agg(len)
    # remote_ip = remote_ip.divide(remote_ip.sum())
    sorted_ip = remote_ip.sort_values()[-n:]
    ax = sorted_ip.plot(kind='barh', title='Remote Access', rot=45, alpha=0.75)
    ax.set_xlabel('Access Count')
    ax.set_ylabel('Remote IP')
    plt.show()

被請求次數(shù)最多的API

def top_request_api(df, n=5):
    # request = df['request']
    path = df['request']
    # path = request.str.extract('\S+\s*(\S+)')
    # path.value_counts()[:n].plot(kind='pie')
    path.value_counts()[:n].plot(kind='bar')
    plt.show()

請求次數(shù)最多的 HTTP 方法

def top_request_method(df):
    method = df['request'].str.extract('(\S+)')
    method.value_counts().plot(kind='barh')
    plt.show()

訪問頻率

def access_rate_base_datetime(df, rule='D', begin=None, end=None):
    visits = df['request'].copy()
    visits.index = df['date']
    visits = visits.resample(rule, kind='period').count()
    if begin and end:
        visits = visits[begin:end]
    elif begin:
        visits = visits[begin:]
    elif end:
        visits = visits[:end]

    visits.plot()
    plt.title('Total visits')
    plt.ylabel('vistis')
    plt.xlabel('datetime')
    plt.show()

測試

if __name__ == '__main__':
    import matplotlib.pyplot as plt
    filename = './access.log'
    df = load_csv(filename)
    # print(df.head())
    # top_remote_ip(df, 10)
    # top_request_api(df)
    # top_request_method(df)
    access_rate_base_datetime(df, 'H', '2017-02-17', '2017-02-19')
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末存璃,一起剝皮案震驚了整個濱河市氮昧,隨后出現(xiàn)的幾起案子谈跛,更是在濱河造成了極大的恐慌,老刑警劉巖泌枪,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耳贬,死亡現(xiàn)場離奇詭異,居然都是意外死亡醋旦,警方通過查閱死者的電腦和手機恒水,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饲齐,“玉大人钉凌,你說我怎么就攤上這事∥嫒耍” “怎么了御雕?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長滥搭。 經(jīng)常有香客問我酸纲,道長,這世上最難降的妖魔是什么瑟匆? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任闽坡,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘疾嗅。我一直安慰自己外厂,他們只是感情好,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布代承。 她就那樣靜靜地躺著汁蝶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪论悴。 梳的紋絲不亂的頭發(fā)上穿仪,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機與錄音意荤,去河邊找鬼。 笑死只锻,一個胖子當著我的面吹牛玖像,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播齐饮,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼捐寥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了祖驱?” 一聲冷哼從身側響起握恳,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捺僻,沒想到半個月后乡洼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡匕坯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年束昵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片葛峻。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡锹雏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出术奖,到底是詐尸還是另有隱情礁遵,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布采记,位于F島的核電站佣耐,受9級特大地震影響,放射性物質發(fā)生泄漏挺庞。R本人自食惡果不足惜晰赞,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧掖鱼,春花似錦然走、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至褐墅,卻和暖如春拆檬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背妥凳。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工竟贯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人逝钥。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓屑那,卻偏偏與公主長得像,于是被迫代替她去往敵國和親艘款。 傳聞我的和親對象是個殘疾皇子持际,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)哗咆,斷路器蜘欲,智...
    卡卡羅2017閱讀 134,629評論 18 139
  • 第一章 Nginx簡介 Nginx是什么 沒有聽過Nginx?那么一定聽過它的“同行”Apache吧晌柬!Ngi...
    JokerW閱讀 32,649評論 24 1,002
  • 配置運行Nginx服務器用戶(組) 用于配置運行Nginx服務器用戶(組)的指令是user姥份,其語法格式為: use...
    吃瓜的東閱讀 4,486評論 0 41
  • Nginx簡介 解決基于進程模型產(chǎn)生的C10K問題,請求時即使無狀態(tài)連接如web服務都無法達到并發(fā)響應量級一萬的現(xiàn)...
    魏鎮(zhèn)坪閱讀 1,993評論 0 9
  • 上一篇《WEB請求處理一:瀏覽器請求發(fā)起處理》,我們講述了瀏覽器端請求發(fā)起過程空繁,通過DNS域名解析服務器IP殿衰,并建...
    七寸知架構閱讀 80,942評論 21 356