Home > Python > Pythonで簡易Apacheログ集計

Pythonで簡易Apacheログ集計

  • 2007-04-13 (金) 16:30
  • Python

仕事でWebサイトの負荷テストをやっている時に、PVをその場で簡単に調べたい場面があった。
車輪の再発明と思ったが、勉強によい機会だと思いPythonでスクリプトを書いてみた。

使い方は、
python logcheck.py file [interval]

fileはログファイルを指定。(標準入力の時は「-」)

intervalはログ集計の間隔を秒数で指定する。
1秒ごとにPV集計したければ1、1分ごとに集計したければ60と入力すればOK。
これを作ったときに、1秒ごと、10秒ごと、1分ごとなどいくつかに分けてグラフを見たかったので。
デフォルトは60秒です。

特定のURLへのアクセスをみるときは、ログファイルをgrepしてパイプでつなげてこのスクリプトを呼んでください。

勉強だと思って無駄にジェネレータとかクロージャとか使っていて、分かりにくいソースになっているかもしれないけど、もし気付いたところとかあれば添削してもらえると嬉しいです。

logcheck.py

PYTHON:
  1. #!/usr/bin/env python
  2.  
  3. import sys
  4. import time
  5.  
  6. def logcheck(f, interval):
  7.     log_time = 0
  8.     access_count = 0
  9.  
  10.     # functions for log interval
  11.     def calctime(log_time_str):
  12.         log_time = int(time.mktime(
  13.                     time.strptime(log_time_str.split()[3][1:],
  14.                         '%d/%b/%Y:%H:%M:%S')))
  15.         return log_time - (log_time % interval)
  16.  
  17.     def makerange(start, end):
  18.         return range(start + interval, end, interval)
  19.  
  20.     def isnotnext(a, b):
  21.         return b <a + interval
  22.  
  23.     gen = getonerow(f, calctime)
  24.  
  25.     while True:
  26.         try:
  27.             x = gen.next()
  28.         except (ValueError, IndexError):
  29.             continue
  30.         except StopIteration:
  31.             printcount(log_time, access_count)
  32.             break
  33.  
  34.         if isnotnext(log_time, x):
  35.             access_count += 1
  36.             continue
  37.  
  38.         if log_time:
  39.             printcount(log_time, access_count)
  40.  
  41.             for i in makerange(log_time, x):
  42.                 printcount(i, 0)
  43.  
  44.         log_time = x
  45.         access_count = 1
  46.  
  47.  
  48. def printcount(log_time, access_count):
  49.     if log_time:
  50.         print "%s %i" % (time.strftime('%d/%b/%Y:%H:%M:%S',
  51.                             time.localtime(log_time)),
  52.                         access_count)
  53.  
  54.  
  55. def getonerow(f, func):
  56.     for l in f:
  57.         yield func(l)
  58.  
  59.  
  60. def main():
  61.     try:
  62.         if len(sys.argv) <2:
  63.             print 'arg error'
  64.             return
  65.  
  66.         if sys.argv[1] == '-':
  67.             f = sys.stdin
  68.         else:
  69.             try:
  70.                 f = open(sys.argv[1], "r")
  71.             except:
  72.                 print 'can\'t open file'
  73.                 return
  74.  
  75.         if len(sys.argv)>= 3 and int(sys.argv[2]):
  76.             interval = int(sys.argv[2])
  77.         else:
  78.             interval = 60
  79.              
  80.         logcheck(f, interval)
  81.     except KeyboardInterrupt:
  82.         print "stoped by user"
  83.  
  84.     f.close()
  85.  
  86. if __name__ == '__main__':
  87.     main()

Comments:0

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://blog.joyfullife.jp/archives/2007/04/13163022.php/trackback
Listed below are links to weblogs that reference
Pythonで簡易Apacheログ集計 from 30からのBlog

Home > Python > Pythonで簡易Apacheログ集計

Search
Feeds
Meta

Return to page top