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…
	
	Add table
		Add a link
		
	
		Reference in a new issue