Python基於nginx訪問日誌並統計IP訪問量

    若是想看看Nginx有多少IP訪問量,有哪些國家訪問,並顯示IP地址的歸屬地分佈,python能夠結合使用高春輝老師ipip.net免費版 IP 地址數據庫】,Shell能夠使用nali,我這邊主要使用python語言來實現需求,並將查詢結果以郵件形式發送,也是爲了學習和回顧python語言。很感謝高春輝老師提供的免費版IP地址數據庫。html


1、Ningx日誌以下:
python

41.42.97.104 - - [26/Feb/2015:03:35:40 -0500] "GET /root/ HTTP/1.1" 301 20 "http://baibai.123.com/09" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36" - 0.562 
41.42.97.104 - - [26/Feb/2015:03:35:41 -0500] "GET /crossadkla.xml HTTP/1.1" 304 0 "https://baibai.123.com/" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36" - 0.000 
99.122.189.203 - - [26/Feb/2015:03:35:42 -0500] "GET /root/ HTTP/1.1" 301 20 "http://baibai.123.com/11" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36" - 0.562 
99.122.189.203  - - [26/Feb/2015:03:35:44 -0500] "GET /crossadkla.xml HTTP/1.1" 304 0 "https://baibai.123.com/" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36" - 0.000
99.122.189.203  - - [26/Feb/2015:03:35:44 -0500] "GET /crossadkla.xml HTTP/1.1" 304 0 "https://baibai.123.com/" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36" - 0.000

2、下載 免費版 IP 地址數據庫nginx

 #wget  http://s.qdcdn.com/17mon/17monipdb.zip
 #unzip  17monipdb.zip

3、IP庫常見問題FAQgit

 示例代碼:github

import os
from ipip import IP
from ipip import IPX

IP.load(os.path.abspath("mydata4vipday2.dat"))
print IP.find("118.28.8.8")

IPX.load(os.path.abspath("mydata4vipday2.datx"))
print IPX.find("118.28.8.8")

 執行輸出:數據庫

中國  天津  天津      鵬博士
中國  天津  天津      鵬博士   39.128399   117.185112  Asia/Shanghai   UTC+8   120000

 IP庫guihub地址:https://github.com/17mon/pythonbash

4、Python 統計代碼app

#encoding=utf8

import re,sys,os,csv,smtplib
from ipip import IP
from ipip import IPX
from email import encoders
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from optparse import OptionParser
reload(sys)
sys.setdefaultencoding('utf-8')
print sys.getdefaultencoding()

nginx_log_path="/app/nginx/logs/apptest_www.access.log"
pattern = re.compile(r'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}')
def stat_ip_views(log_path):
    ret={}
    f = open(log_path, "r")
    for line in f:
        match = pattern.match(line)
        if match:
            ip=match.group(0)
            if ip in ret:
                views=ret[ip]
            else:
                views=0
            views=views+1
            ret[ip]=views
    return ret
    
def run():
    ip_views=stat_ip_views(nginx_log_path)
    max_ip_view={}
    fileName='out.csv'
    f=open('out.csv','w+')
    b = 'IP,國家,訪問數總數'
    print >> f,b
    for ip in ip_views:
        IP.load(os.path.abspath("17monipdb.dat"))
        count=IP.find("%s"% (ip))
        conut_s=count.split()
        countery=conut_s[0]
        views=ip_views[ip]
        c = '%s,%s,%s' %(ip,countery,views)
        print >> f,c
        if len(max_ip_view)==0:
            max_ip_view[ip]=views
        else:
            _ip=max_ip_view.keys()[0]
            _views=max_ip_view[_ip]
            if views>_views:
                max_ip_view[ip]=views
                max_ip_view.pop(_ip)
        print "IP:", ip, "國家:", countery, "訪問數:", views 
        
    print "總共有多少IP:", len(ip_views)
    print "最大訪問IP數:", max_ip_view
    g = ""
    d = '總共有多少IP:%s' %(len(ip_views))
    e = '最大訪問IP數:%s' %(max_ip_view)
    print >> f,g
    print >> f,d
    print >> f,e

def sendMail(html,emailaddress,mailSubject,from_address="other@test.com"):
        mail_list=emailaddress.split(",")
        msg=MIMEMultipart()
        msg['Accept-Language']='zh-CN'
        msg['Accept-Charset']= 'ISO-8859-1,utf-8'
        msg['From']=from_address
        msg['to']=";".join(mail_list)
        msg['Subject']=mailSubject.decode("utf-8")
        txt=MIMEText(html,'html','utf-8')
        txt.set_charset('utf-8')
        msg.attach(txt)
        file=MIMEBase('application', 'octet-stream')
        file.set_payload(open(fileName, 'rb').read())
        encoders.encode_base64(file)
        file.add_header('Content-Disposition', 'p_w_upload; filename="%s"' % os.path.basename(fileName))
        msg.attach(file)
        smtp=smtplib.SMTP("mail.test.com")
        smtp.sendmail(msg["From"],mail_list,msg.as_string())
        smtp.close()

if __name__ == '__main__':
    run()
    fileName='out.csv'
    cmd = 'iconv -f UTF8 -t GB18030 %s -o %s.bak && mv %s.bak %s' %(fileName,fileName,fileName,fileName)
    os.system(cmd)
    Content= 'Dear ALL: <br> &nbsp;&nbsp; 附件內國家IP訪問數據分析統計,請查收!  <br> &nbsp;&nbsp; 若有任何問題,請及時與我聯繫!'
    Subject = '[分析]國家建立數據IP分析統計'
    sendMail(html=Content,emailaddress='kuangl@test.com',mailSubject=Subject)

5、執行結果ide

utf-8
IP: 41.42.97.104 國家: 埃及 訪問數: 2
IP: 99.122.189.203 國家: 美國 訪問數: 3
總共有多少IP: 2
最大訪問IP數: {'99.122.189.203': 3}

6、郵件發送結果學習

wKioL1Tu5XmwRhZ6AACUl5-Zu80979.jpg

相關文章
相關標籤/搜索