commit
3818c4eaf7
1 changed files with 82 additions and 0 deletions
82
vlogsplitter/vlogsplitter
Executable file
82
vlogsplitter/vlogsplitter
Executable file
|
@ -0,0 +1,82 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
This script is a replacement for split-logfile and rotatelogs from the
|
||||||
|
Apache webserver distribution suited as a pipe log consumer. It has a
|
||||||
|
file handle pool like vlogger.
|
||||||
|
|
||||||
|
Copyright (c) 2008 Jan Dittberner <jan@dittberner.info>
|
||||||
|
Version: $Id$
|
||||||
|
"""
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
|
||||||
|
FHPOOL = {}
|
||||||
|
FHPOOLSIZE = 100
|
||||||
|
|
||||||
|
|
||||||
|
def getfromfhpool(key, dirname, filename):
|
||||||
|
"""Get a file handle from the filehandle pool.
|
||||||
|
|
||||||
|
The function checks whether a filehandle for the given key is in
|
||||||
|
the pool and returns it. If there is no such handle the pool size
|
||||||
|
is checked and when it would be exceeded an LRU algorithm is used
|
||||||
|
to remove the oldest handle from the cache. When removing the item
|
||||||
|
from the cache the file is closed. After the pool size check the
|
||||||
|
file identified by dirname and filename is opened for appending
|
||||||
|
log date..
|
||||||
|
"""
|
||||||
|
now = time.time()
|
||||||
|
if key in FHPOOL:
|
||||||
|
FHPOOL[key][0] = now
|
||||||
|
return FHPOOL[key][1]
|
||||||
|
if len(FHPOOL) == FHPOOLSIZE:
|
||||||
|
mintime = now
|
||||||
|
minkey = None
|
||||||
|
for (ckey, value) in FHPOOL.iteritems():
|
||||||
|
if value[0] <= mintime:
|
||||||
|
mintime = value[0]
|
||||||
|
minkey = ckey
|
||||||
|
FHPOOL[minkey][1].close()
|
||||||
|
del FHPOOL[minkey]
|
||||||
|
FHPOOL[key] = [now, open(os.path.join(dirname, filename), "a")]
|
||||||
|
return FHPOOL[key][1]
|
||||||
|
|
||||||
|
|
||||||
|
def handlelogs(basedir, logfilename, inputdata):
|
||||||
|
"""
|
||||||
|
This function controls the input parsing process.
|
||||||
|
|
||||||
|
It reads one log line at a time and adds it to the appropriate log
|
||||||
|
file.
|
||||||
|
"""
|
||||||
|
while 1:
|
||||||
|
line = inputdata.readline()
|
||||||
|
if line.find(" ") == -1:
|
||||||
|
continue
|
||||||
|
(vhost, logentry) = line.split(" ", 1)
|
||||||
|
if vhost and logentry:
|
||||||
|
logdir = os.path.join(basedir, vhost)
|
||||||
|
if not os.path.isdir(logdir):
|
||||||
|
os.makedirs(logdir)
|
||||||
|
fhandle = getfromfhpool(vhost, logdir, logfilename)
|
||||||
|
fhandle.write(logentry)
|
||||||
|
fhandle.flush()
|
||||||
|
|
||||||
|
|
||||||
|
def usage():
|
||||||
|
"""Usage: %s <logbasedir> <logfilename>
|
||||||
|
|
||||||
|
Logs incoming lines in a format starting with a vhost field to
|
||||||
|
<logbasedir>/<vhost>/<logfilename>. Directories below <logbasedir>
|
||||||
|
are created automatically.
|
||||||
|
"""
|
||||||
|
print usage.__doc__ % (sys.argv[0])
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
if len(sys.argv) < 3:
|
||||||
|
usage()
|
||||||
|
sys.exit(1)
|
||||||
|
handlelogs(sys.argv[1], sys.argv[2], sys.stdin)
|
Loading…
Reference in a new issue