这是Python for Uinux/Linux系统管理里面中一个例子,对最后的if做了修改,简单修改了异常语句以及增加了每个IP的流量统计。目前只能对单个日子文件做统计。

 

 
  1. #!/usr/bin/evn python 
  2. ''' 
  3. USEAGE: 
  4. apache_log_split.py some_log_file 
  5. ''' 
  6. import sys 
  7.  
  8. def formatlogline(line): 
  9.         split_line=line.split() 
  10.         return {'remote_host':split_line[0], 
  11.                 'status':split_line[8], 
  12.                 'bytes_sent':split_line[9], 
  13.                 } 
  14. def generate_log_report(logfile): 
  15.         report_dict={} 
  16.         for line in logfile: 
  17.                 line_dict=formatlogline(line) 
  18.                 #print line_dict 
  19.                 try: 
  20.                         bytes_send=int(line_dict['bytes_sent']) 
  21.                 except ValueError: 
  22.                         continue 
  23.                 report_dict.setdefault(line_dict['remote_host'],[]).append(bytes_send) 
  24.         return report_dict 
  25.  
  26. if __name__=='__main__': 
  27.         if not len(sys.argv) > 1: 
  28.                 print __doc__ 
  29.                 sys.exit(1) 
  30.         infile_name=sys.argv[1] 
  31.         try: 
  32.                 infile=open(infile_name,'r') 
  33.         except IOError: 
  34.                 print "infile_name not found!" 
  35.                 print __doc__ 
  36.                 sys.exit(1) 
  37.         else: 
  38.                 log_report=generate_log_report(infile) 
  39.                 #print log_report 
  40.                 for k in log_report: 
  41.                         print "IP: %s => byte_total: %s" % (k,sum(log_report[k])) 
  42.                 infile.close() 

这个程序在LOG抓取时有个小BUG,处理后的数据有

{'status': '304', 'bytes_sent': '-', 'remote_host': '192.168.1.1'}

bytes_sent为'-'这个会造成后续的处理错误。解决办法修改函数
formatlogline
 
  1. def formatlogline(line): 
  2.         split_line=line.split() 
  3.         dict_line={'remote_host':split_line[0], 
  4.                    'status':split_line[8], 
  5.                    'bytes_sent':split_line[9], 
  6.                   } 
  7.         if dict_line['bytes_sent']=='-': 
  8.                 dict_line['bytes_sent']='0' 
  9.                 #return dict_line 
  10.         return dict_line