apache-fake-log-gen.py 3.0 KB

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