#!/usr/bin/env python #coding:utf8 import os import fileinput import re import sys import MySQLdb #日誌的位置 logfile=open("access_20130812.log") '''使用的nginx預設日誌格式$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"''' #日誌分析Regex #203.208.60.230 ipP = r"?P<ip>[d.]*" '''以[開始,除[]以外的任一字元 防止匹配上下個[]項目 (也可以使用非貪婪匹配*?) 不在中括弧裡的.可以匹配換行外的任一字元 *這樣地重複是"貪婪的“ 運算式引擎會試著重複儘可能多的次數。#以]結束''' #[21/Jan/2011:15:04:41 +0800] timeP = r"""?P<time>[[^[]]*]""" '''以"開始, #除雙引號以外的任一字元 防止匹配上下個""項目 (也可以使用非貪婪匹配*?),#以"結束''' #"GET /EntpShop.do?method=view&shop_id=391796 HTTP/1.1" #"GET /EntpShop.do?method=view&shop_id=391796 HTTP/1.1" requestP = r"""?P<request>"[^"]*"""" statusP = r"?P<status>d+" bodyBytesSentP = r"?P<bodyByteSent>d+" '''以"開始, 除雙引號以外的任一字元 防止匹配上下個""項目 (也可以使用非貪婪匹配*?),#以"結束''' #"http://test.myweb.com/myAction.do?method=view&mod_id=&id=1346" referP = r"""?P<refer>"[^"]*"""" '''以"開始, 除雙引號以外的任一字元 防止匹配上下個""項目 (也可以使用非貪婪匹配*?),以"結束''' '''"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"'''' userAgentP = r"""?P<userAgent>"[^"]*"""" '''以(開始, 除雙引號以外的任一字元 防止匹配上下個() 項目(也可以使用非貪婪匹配*?),以"結束''' '''(compatible; Googlebot/2.1; +http://www.google.com/bot.html)"'''' userSystems = re.compile(r'([^()]*)') '''以"開始,除雙引號以外的任一字元防止匹配上下個""項目 (也可以使用非貪婪匹配*?),以"結束''' userlius = re.compile(r'[^)]*"') #原理:主要通過空格和-來區分各不同項目,各項目內部寫各自的匹配運算式 nginxLogPattern = re.compile(r" (%s) - - (%s) (%s) (%s) (%s) (%s) (%s)" %(ipP, timeP, requestP, statusP, bodyBytesSentP, referP, userAgentP), re.VERBOSE) #資料庫連接資訊 conn=MySQLdb.connect(host='192.168.1.22', user='test',passwd='pass' ,port=3306,db='python') cur=conn.cursor() sql = "INSERT INTO python.test VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s)" while True: line = logfile.readline() if not line:break matchs = nginxLogPattern.match(line) if matchs != None: allGroup = matchs.groups() ip = allGroup[0] time = allGroup[1] request = allGroup[2] status = allGroup[3] bodyBytesSent = allGroup[4] refer = allGroup[5] userAgent = allGroup[6] Time = time.replace('T',' ')[1:-7] if len(userAgent) > 20: userinfo = userAgent.split(' ') userkel = userinfo[0] try: usersystem = userSystems.findall(userAgent) usersystem = usersystem[0] print usersystem userliu = userlius.findall(userAgent) value = [ip,Time,request,status, bodyBytesSent,refer,userkel,usersystem,userliu[1]] conn.commit() print value except IndexError: userinfo = userAgent value = [ip,Time,request,status, bodyBytesSent,refer,userinfo,"",""] else: useraa = userAgent value = [ip,Time,request,status, bodyBytesSent,refer,useraa,"",""] try: result = cur.execute(sql,value) #conn.commit() print result except MySQLdb.Error,e: print "Mysql Error %d: %s" % (e.args[0], e.args[1]) conn.commit() conn.close() |