from operator import itemgetter from socket import gethostbyaddr, herror import time accessLog = "/var/log/apache2/access_log" def track(filename, logFile=accessLog): """Retrieve request statistics for a specific file in an access log.""" log = open(logFile) filename = '/' + filename.lstrip('/') access = {} for line in log: parts = line.split() if parts[6] == filename: timeStr = parts[3] accessTime = time.strptime(timeStr, "[%d/%b/%Y:%H:%M:%S") access[parts[0]] = (accessTime, access.get(parts[0], ('', 0))[1] + 1) print '%s has been requested by %d people and hit %d times.' % \ (filename, len(access), sum(map(itemgetter(1), access.itervalues()))) accessTuple = sorted(access.iteritems(), key=itemgetter(1)) hitWidth = len(str(max([data[1] for user, data in accessTuple]))) for user, data in accessTuple: lastAccess, hits = data print 'User: %s Last Access: %s Hits: %s' % \ ((user+",").ljust(16), time.strftime("%a %d-%b-%Y %I:%M:%S %p,", lastAccess), str(hits).rjust(hitWidth)) return accessTuple def resolve(*args): """Resolve a sequence of IP addresses to their hostnames, if possible.""" if len(args) > 1: addrList = args else: addrList = args[0] for addr in addrList: if isinstance(addr, tuple): addr = addr[0] try: host = gethostbyaddr(addr)[0] except (herror, IndexError): host = addr print 'Addr: %s Hostname: %s' % ((addr+',').ljust(16), host) if __name__ == "__main__": import sys if len(sys.argv) < 2: print "Usage: python track_access.py filename access_log" else: if len(sys.argv) > 2: accessLog = sys.argv[2] resolve(track(sys.argv[1], accessLog))