- 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:
-
#!/usr/bin/env python
-
-
import sys
-
import time
-
-
def logcheck(f, interval):
-
log_time = 0
-
access_count = 0
-
-
# functions for log interval
-
def calctime(log_time_str):
-
log_time = int(time.mktime(
-
time.strptime(log_time_str.split()[3][1:],
-
'%d/%b/%Y:%H:%M:%S')))
-
return log_time - (log_time % interval)
-
-
def makerange(start, end):
-
return range(start + interval, end, interval)
-
-
def isnotnext(a, b):
-
return b <a + interval
-
-
gen = getonerow(f, calctime)
-
-
while True:
-
try:
-
x = gen.next()
-
except (ValueError, IndexError):
-
continue
-
except StopIteration:
-
printcount(log_time, access_count)
-
break
-
-
if isnotnext(log_time, x):
-
access_count += 1
-
continue
-
-
if log_time:
-
printcount(log_time, access_count)
-
-
for i in makerange(log_time, x):
-
printcount(i, 0)
-
-
log_time = x
-
access_count = 1
-
-
-
def printcount(log_time, access_count):
-
if log_time:
-
print "%s %i" % (time.strftime('%d/%b/%Y:%H:%M:%S',
-
time.localtime(log_time)),
-
access_count)
-
-
-
def getonerow(f, func):
-
for l in f:
-
yield func(l)
-
-
-
def main():
-
try:
-
if len(sys.argv) <2:
-
print 'arg error'
-
return
-
-
if sys.argv[1] == '-':
-
f = sys.stdin
-
else:
-
try:
-
f = open(sys.argv[1], "r")
-
except:
-
print 'can\'t open file'
-
return
-
-
if len(sys.argv)>= 3 and int(sys.argv[2]):
-
interval = int(sys.argv[2])
-
else:
-
interval = 60
-
-
logcheck(f, interval)
-
except KeyboardInterrupt:
-
print "stoped by user"
-
-
f.close()
-
-
if __name__ == '__main__':
-
main()
- Newer: さくらインターネット、CGIでDjangoを動かす
- Older: 四谷学院の電車広告に思うこと
Comments:0
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