python分析apache访问日志脚本分享

#!/usr/bin/env python
# coding=utf-8

#------------------------------------------------------
# Name:     Apache 日志分析脚本
# Purpose:   此脚本只用来分析Apache的访问日志
# Version:   2.0
# Author:    LEO
# Created:   2013-4-26
# Modified:   2013-5-4
# Copyright:  (c) LEO 2013
#------------------------------------------------------

import sys
import time

#该类是用来打印格式
class displayFormat(object):

  def format_size(self,size):
    '''格式化流量单位'''
    KB = 1024
    MB = 1048576
    GB = 1073741824
    TB = 1099511627776
    if size >= TB :
      size = str(size / TB) + 'T'
    elif size < KB :
      size = str(size) + 'B'
    elif size >= GB and size < TB:
      size = str(size / GB) + 'G'
    elif size >= MB and size < GB :
      size = str(size / MB) + 'M'
    else :
      size = str(size / KB) + 'K'
    return size

  formatstring = '%-15s %-10s %-12s %8s %10s %10s %10s %10s %10s %10s %10s'

  def transverse_line(self) :
    '''输出横线'''
    print self.formatstring % ('-'*15,'-'*10,'-'*12,'-'*12,'-'*10,'-'*10,'-'*10,'-'*10,'-'*10,'-'*10,'-'*10)

  def head(self):
    '''输出头部信息'''
    print self.formatstring % ('IP','Traffic','Times','Times%','200','404','500','403','302','304','503')

  def error_print(self) :
    '''输出错误信息'''
    print
    print 'Usage : ' + sys.argv[0] + ' ApacheLogFilePath [Number]'
    print
    sys.exit(1)

  def execut_time(self):
    '''输出脚本执行的时间'''
    print
    print "Script Execution Time: %.3f second" % time.clock()
    print

#该类是用来生成主机信息的字典
class hostInfo(object):

  host_info = ['200','404','500','302','304','503','403','times','size']

  def __init__(self,host):
    self.host = host = {}.fromkeys(self.host_info,0)

  def increment(self,status_times_size,is_size):
    '''该方法是用来给host_info中的各个值加1'''
    if status_times_size == 'times':
      self.host['times'] += 1
    elif is_size:
      self.host['size'] = self.host['size'] + status_times_size
    else:
      self.host[status_times_size] += 1

  def get_value(self,value):
    '''该方法是取到各个主机信息中对应的值'''
    return self.host[value]

#该类是用来分析文件
class fileAnalysis(object):
  def __init__(self):
    '''初始化一个空字典'''
    self.report_dict = {}
    self.total_request_times,self.total_traffic,self.total_200,
    self.total_404,self.total_500,self.total_403,self.total_302,
    self.total_304,self.total_503 = 0,0,0,0,0,0,0,0,0

  def split_eachline_todict(self,line):
    '''分割文件中的每一行,并返回一个字典'''
    split_line = line.split()
    split_dict = {'remote_host':split_line[0],'status':split_line[-2],'bytes_sent':split_line[-1],}
    return split_dict

  def generate_log_report(self,logfile):
    '''读取文件,分析split_eachline_todict方法生成的字典'''
    for line in logfile:
      try:
        line_dict = self.split_eachline_todict(line)
        host = line_dict['remote_host']
        status = line_dict['status']
      except ValueError :
        continue
      except IndexError :
        continue

      if host not in self.report_dict :
        host_info_obj = hostInfo(host)
        self.report_dict[host] = host_info_obj
      else :
        host_info_obj = self.report_dict[host]

      host_info_obj.increment('times',False)
      if status in host_info_obj.host_info :
        host_info_obj.increment(status,False)
      try:
        bytes_sent = int(line_dict['bytes_sent'])
      except ValueError:
        bytes_sent = 0
      host_info_obj.increment(bytes_sent,True)
    return self.report_dict

  def return_sorted_list(self,true_dict):
    '''计算各个状态次数、流量总量,请求的总次数,并且计算各个状态的总量 并生成一个正真的字典,方便排序'''
    for host_key in true_dict :
      host_value = true_dict[host_key]
      times = host_value.get_value('times')
      self.total_request_times = self.total_request_times + times
      size = host_value.get_value('size')
      self.total_traffic = self.total_traffic + size 

      o200 = host_value.get_value('200')
      o404 = host_value.get_value('404')
      o500 = host_value.get_value('500')
      o403 = host_value.get_value('403')
      o302 = host_value.get_value('302')
      o304 = host_value.get_value('304')
      o503 = host_value.get_value('503')

      true_dict[host_key] = {'200':o200,'404':o404,'500':o500,'403':o403,'302':o302,'304':o304,
                  '503':o503,'times':times,'size':size}

      self.total_200 = self.total_200 + o200
      self.total_404 = self.total_404 + o404
      self.total_500 = self.total_500 + o500
      self.total_302 = self.total_302 + o302
      self.total_304 = self.total_304 + o304
      self.total_503 = self.total_503 + o503

    sorted_list = sorted(true_dict.items(),key=lambda t:(t[1]['times'],t[1]['size']),reverse=True)
    return sorted_list

class Main(object):
  def main(self) :
    '''主调函数'''
    display_format = displayFormat()
    arg_length = len(sys.argv)
    if arg_length == 1 :
      display_format.error_print()
    elif arg_length == 2 or arg_length == 3:
      infile_name = sys.argv[1]
      try :
        infile = open(infile_name,'r')
        if arg_length == 3 :
          lines = int(sys.argv[2])
        else :
          lines = 0
      except IOError,e :
        print
        print e
        display_format.error_print()
      except ValueError :
        print
        print "Please Enter A Volid Number !!"
        display_format.error_print()
    else :
      display_format.error_print()

    fileAnalysis_obj = fileAnalysis()
    not_true_dict = fileAnalysis_obj.generate_log_report(infile)
    log_report = fileAnalysis_obj.return_sorted_list(not_true_dict)
    total_ip = len(log_report)
    if lines :
      log_report = log_report[0:lines]
    infile.close()

    print
    total_traffic = display_format.format_size(fileAnalysis_obj.total_traffic)
    total_request_times = fileAnalysis_obj.total_request_times
    print 'Total IP: %s  Total Traffic: %s  Total Request Times: %d'
       % (total_ip,total_traffic,total_request_times)
    print
    display_format.head()
    display_format.transverse_line()

    for host in log_report :
      times = host[1]['times']
      times_percent = (float(times) / float(fileAnalysis_obj.total_request_times)) * 100
      print display_format.formatstring % (host[0],
                         display_format.format_size(host[1]['size']),
                         times,str(times_percent)[0:5],
                         host[1]['200'],host[1]['404'],
                         host[1]['500'],host[1]['403'],
                         host[1]['302'],host[1]['304'],host[1]['503'])

    if (not lines) or total_ip == lines :
      display_format.transverse_line()
      print display_format.formatstring % (total_ip,total_traffic,
                         total_request_times,'100%',
                         fileAnalysis_obj.total_200,
                         fileAnalysis_obj.total_404,
                         fileAnalysis_obj.total_500,
                         fileAnalysis_obj.total_403,
                         fileAnalysis_obj.total_302,
                         fileAnalysis_obj.total_304,
                         fileAnalysis_obj.total_503)
    display_format.execut_time()

if __name__ == '__main__':
  main_obj = Main()
  main_obj.main()
(0)

相关推荐

  • Python 分析Nginx访问日志并保存到MySQL数据库实例

    使用Python 分析Nginx access 日志,根据Nginx日志格式进行分割并存入MySQL数据库.一.Nginx access日志格式如下: 复制代码 代码如下: $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_f

  • 利用python分析access日志的方法

    前言 WAF上线之后,处理最多的是误报消除. 产生误报有多种原因,比如web应用源码编写时允许客户端提交过多的cookie:比如单个参数提交的数值太大. 把误报降低到了可接受的范围后,还要关注漏报.WAF不是神,任何WAF都可能被绕过.所以还需要定位漏过的攻击,明确漏报的原因,才能update WAF的策略. 要定位漏报,就必须分析Web应用的访问日志了.一个站点,每天产生的access日志大概接近1GB,显然靠肉眼看是不现实的.这就需要用python帮助自动分析. 实现思路 拿我司某Web系统

  • python脚本实现分析dns日志并对受访域名排行

    前段时间有个需求是要求查一段时间的dns上的域名访问次数排行(top100),没办法,只好慢慢的去解析dns日志呗,正好学习了python,拿来练练手. 1.原始数据分析: 首先看下原始数据文件,即dns日志内容,下面是抽取的几条有代表性的日志,2×8.2×1.2x.1×5 这种中间的x是相应的数字被我抹去了. 复制代码 代码如下: 13-08-30 03:11:34,226 INFO : queries: – |1×3.2×8.2×0.2×0|config.dengluqi.net||conf

  • 使用python分析git log日志示例

    用git来管理工程的开发,git log是非常有用的'历史'资料,需求就是来自这里,我们希望能对git log有一个定制性强的过滤.此段脚本就是在完成这种类型的任务.对于一个repo所有branch中的commit,脚本将会把message中存在BUG ID的一类commits给提取整理出来,并提供了额外的search_key, 用于定制过滤. 复制代码 代码如下: # -*- coding: utf-8 -*-# created by vince67 Feb.2014# nuovince@gm

  • python实现分析apache和nginx日志文件并输出访客ip列表的方法

    本文实例讲述了python实现分析apache和nginx日志文件并输出访客ip列表的方法.分享给大家供大家参考.具体如下: 这里使用python分析apache和nginx日志文件输出访客ip列表 ips = {} fh = open("/var/log/nginx/access.log", "r").readlines() for line in fh: ip = line.split(" ")[0] if 6 < len(ip) &l

  • python自动化工具日志查询分析脚本代码实现

    受控节点slave.py 复制代码 代码如下: import socketimport reclass Log(object):    file_list=['access.log','C:\\access.log']    master_ip='192.168.0.103'    def __init__(self):        s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)        s.bind(('',3333))      

  • python分析nignx访问日志脚本分享

    #!/usr/bin/env python # coding=utf-8 #------------------------------------------------------ # Name: nginx 日志分析脚本 # Purpose: 此脚本只用来分析nginx的访问日志 # Version: 1.0 # Author: LEO # Created: 2013-05-07 # Modified: 2013-05-07 # Copyright: (c) LEO 2013 #-----

  • Python操作Access数据库基本步骤分析

    本文实例分析了Python操作Access数据库基本步骤.分享给大家供大家参考,具体如下: Python编程语言的出现,带给开发人员非常大的好处.我们可以利用这样一款功能强大的面向对象开源语言来轻松的实现许多特定功能需求.比如Python操作Access数据库的功能实现等等.在Python操作Access数据库之前,首先,你应安装了Python和Python for Windows extensions. 步骤之1.建立数据库连接 import win32com.client conn = wi

  • python实现apahce网站日志分析示例

    维护脚本一例,写得有点乱,只是作为一个实例,演示如何快速利用工具快速达到目的:应用到:shell与python数据交互.数据抓取,编码转换 复制代码 代码如下: #coding:utf-8#!/usr/bin/python'''程序说明:apache access.log日志分析 分析访问网站IP 来源情况 日期:2014-01-06 17:01 author:gyh9711 程序说明:应用到:shell与python数据交互.数据抓取,编码转换'''import osimport jsonim

  • python写的一个squid访问日志分析的小程序

    这两周组里面几位想学习python,于是我们就创建了一个这样的环境和氛围来给大家学习. 昨天在群里,贴了一个需求,就是统计squid访问日志中ip 访问数和url的访问数并排序,不少同学都大体实现了相应的功能,我把我简单实现的贴出来,欢迎拍砖: 日志格式如下: 复制代码 代码如下: %ts.%03tu %6tr %{X-Forwarded-For}>h %Ss/%03Hs %<st %rm %ru  %un %Sh/%<A %mt "%{Referer}>h"

随机推荐