apache-fake-log-gen.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #!/usr/bin/python
  2. import time
  3. import datetime
  4. import pytz
  5. import random
  6. import gzip
  7. import sys
  8. import argparse
  9. from faker import Faker
  10. from random import randrange
  11. #todo:
  12. # - generate Gaussian distribution of responses and verbs
  13. # - allow writing different patterns (Common Log, Custom log, error log etc)
  14. # - log rotation
  15. class switch(object):
  16. def __init__(self, value):
  17. self.value = value
  18. self.fall = False
  19. def __iter__(self):
  20. """Return the match method once, then stop"""
  21. yield self.match
  22. raise StopIteration
  23. def match(self, *args):
  24. """Indicate whether or not to enter a case suite"""
  25. if self.fall or not args:
  26. return True
  27. elif self.value in args: # changed for v1.5, see below
  28. self.fall = True
  29. return True
  30. else:
  31. return False
  32. parser = argparse.ArgumentParser(__file__, description="Fake Apache Log Generator")
  33. parser.add_argument("--output", "-o", dest='output_type', help="Output [.Log File,.gz File,Console]", choices=['LOG','GZ','CONSOLE'] )
  34. parser.add_argument("--num", "-n", dest='num_lines', help="Number of lines to generate", type=int, default=1)
  35. parser.add_argument("--prefix", "-p", dest='file_prefix', help="File Prefix", type=str)
  36. args = parser.parse_args()
  37. log_lines = args.num_lines
  38. file_prefix = args.file_prefix
  39. output_type = args.output_type
  40. faker = Faker()
  41. timestr = time.strftime("%Y%m%d-%H%M%S")
  42. otime = datetime.datetime.now()
  43. outFileName = 'access_log_'+timestr+'.log' if not file_prefix else file_prefix+'_access_log_'+timestr+'.log'
  44. for case in switch(output_type):
  45. if case('LOG'):
  46. f = open(outFileName,'w')
  47. break
  48. if case('GZ'):
  49. f = gzip.open(outFileName+'.gz','w')
  50. break
  51. if case('CONSOLE'): pass
  52. if case():
  53. f = sys.stdout
  54. response=["200","404","500","301"]
  55. verb=["GET","POST","DELETE","PUT"]
  56. resources=["/list","/wp-content","/wp-admin","/explore","/search/tag/list","/app/main/posts","/posts/posts/explore","/apps/cart.jsp?appID="]
  57. ualist = [faker.firefox, faker.opera, faker.internet_explorer, faker.chrome, faker.safari]
  58. for i in xrange(0,log_lines):
  59. increment = datetime.timedelta(seconds=random.randint(30,300))
  60. otime += increment
  61. ip = faker.ipv4()
  62. dt = otime.strftime('%d/%b/%Y:%H:%M:%S')
  63. tz = datetime.datetime.now(pytz.timezone('US/Pacific')).strftime('%z')
  64. vrb = random.choice(verb)
  65. uri = random.choice(resources)
  66. if uri.find("apps")>0:
  67. uri += `random.randint(1000,10000)`
  68. resp = random.choice(response)
  69. byt = random.randint(1000,10000)
  70. referer = faker.uri()
  71. useragent = random.choice(ualist)()
  72. f.write('%s - - [%s %s] "%s %s HTTP/1.0" %s %s "%s" "%s"\n' % (ip,dt,tz,vrb,uri,resp,byt,referer,useragent))