Kimuksung
Kimuksung 안녕하세요. 분산처리에 관심이 많은 생각하는 주니어 Data Enginner입니다.

가상 로그 데이터 생성하기

가상 로그 데이터 생성하기

로그 데이터 전체적으로 구성하기 위해서는 로그 데이터가 필요합니다.

별도로 어디서 가져올 수는 없어서 가상의 로그를 만들어보았습니다.

목적

  • 가상의 로그 데이터를 만들어 Kafka에 Produce하기 위함
  • apache faker를 가져다 사용 - https://gitlab.com/kevintvh/Fake-Apache-Log-Generator
  • 원하는 용도에 맞추어 코드를 커스터마이징하여 사용
    • userid
    • ip
    • event_time
    • http_method
    • response
    • url
    • useragent
  • 로그 주기는 1~100초 사이 랜덤 발생
  • Output File은 access_log_{YYYYMMDD} 형태

    1
    
      $ python log_generator.py -n 1000 -o LOG 
    
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# https://gitlab.com/kevintvh/Fake-Apache-Log-Generator
# python log_generator.py -n 10 -o LOG
import time
import datetime
import numpy
import random
import argparse
import uuid
from faker import Faker
from tzlocal import get_localzone

parser = argparse.ArgumentParser(__file__, description="Fake Apache Log Generator")
parser.add_argument("--output", "-o", dest='output_type', help="Write to a Log file, a gzip file or to STDOUT",
                    choices=['LOG', 'GZ', 'CONSOLE'])
parser.add_argument("--num", "-n", dest='num_lines', help="Number of lines to generate (0 for infinite)", type=int,
                    default=1)
parser.add_argument("--prefix", "-p", dest='file_prefix', help="Prefix the output file name", type=str)
parser.add_argument("--sleep", "-s", help="Sleep this long between lines (in seconds)", default=0.0, type=float)

args = parser.parse_args()

# file_info
log_lines = args.num_lines
file_prefix = args.file_prefix
output_type = args.output_type

faker = Faker()

# time
local = get_localzone()
timestr = time.strftime("%Y%m%d")
otime = datetime.datetime.now()

outFileName = 'access_log_' + timestr + '.log'

f = open(outFileName, 'a')

# log infos
response = ["200", "404", "500", "301"]
http_methods = ["GET", "POST", "DELETE", "PUT"]
useragentlist = [faker.firefox, faker.chrome, faker.safari, faker.internet_explorer, faker.opera]

while log_lines:
    if args.sleep:
        increment = datetime.timedelta(seconds=args.sleep)
    else:
        increment = datetime.timedelta(seconds=random.randint(1, 100))
    otime += increment

    userid = uuid.uuid4()
    ip = faker.ipv4()
    dt = otime.strftime('%Y-%m-%d %H:%M:%S')
    timezone = datetime.datetime.now(local).strftime('%z')
    http_method = numpy.random.choice(http_methods, p=[0.6, 0.1, 0.1, 0.2])

    resp = numpy.random.choice(response, p=[0.9, 0.04, 0.02, 0.04])
    uri_data = faker.uri()
    useragent = numpy.random.choice(useragentlist, p=[0.5, 0.3, 0.1, 0.05, 0.05])()
    logs = [userid, ip, dt+timezone, http_method, resp, uri_data, useragent]
    logs = list(map(str, logs))
    f.write("\t".join(logs)+"\n")

    log_lines = log_lines - 1
    if args.sleep:
        time.sleep(args.sleep)