利用faker生成高仿web日志

由于业务分析需要大量的web中间件,一般网站流量较低,拿到的数据有限。因为比较敏感,网上又没有公开的访问日志,最后只能自己动手,利用faker库造一些web访问日志。文章介绍python的faker库具备的功能和生成日志时的一些考量。

faker简介

faker支持多种语言和地区,在不同的语言参数下,会出现部分真实部分虚假的数据。比如会根据真实的国家和地区,捏造一个虚假的街道和门牌号。faker支持多种语言,包括php、python等,下面使用python的faker进行演示。

官方支持的语言表

几个比较常见的语言代号列一下:

  • 简体中文:zh_CN
  • 繁体中文:zh_TW
  • 美国英文:en_US
  • 德文:de_DE
  • 日文:ja_JP

导入使用

from faker import Faker

faker = Faker('zh_CN')
print(faker.address)

支持生成地区

.address()  # 地址
.building_number()  # 楼号
.city()  # 城市
.country()  # 国家
.postcode()  # 邮编
.province()  # 省份

支持生成时间日期,可以返回datetime类型数据

.date(pattern="%Y-%m-%d", end_datetime=None)
.date_object()
.date_time()
.iso8601()
.time(pattern="%H%M%S", end_datetime=None)
.unix_time()
.year()

支持生成和浏览器 User-Agent 相关的内容。

.chrome() 
.firefox()
.internet_explorer()
.safari()
.user_agent()

支持生成与Internet相关的数据,电子邮件、域名、IP地址、URL、后缀名等。

.ascii_company_email()
.ascii_email()
.ascii_free_email()
.domain_name(levels=1)
.free_email()
.free_email_domain()
.image_url()
.ipv4(network=False, address_class=None, private=None)
.ipv4_private(network=False, address_class=None)  # IPv4内网地址
.ipv4_public(network=False, address_class=None)  # IPv4公网地址
.ipv6(network=False)
.mac_address()
.url(schemes=None)

支持生成数据,如密码、sha1、md5 等加密后的内容

.md5(raw_output=False)  # 生成md5
.password(length=10, special_chars=True, digits=True, upper_case=True, lower_case=True)  # 生成密码(支持各种字符)
.sha1(raw_output=False)
.sha256(raw_output=False)
.uuid4(cast_to=<class 'str'>)

生成高仿web日志

这里的日志主要采用web访问日志,即中间件的access.log,先来看看web访问日志的格式。

223.27.40.165 - - [18/Mar/2020:00:55:20 +0800] "GET /blog/list.asp HTTP/1.1" 200 1660 

下面分析一下这些字段和具体用到的方法:

  • 第一个字段是IP地址。做测试的时候一般用公网地址,选择faker.ipv4_public()方法了来生成IPv4的地址。
  • 第二个字段几乎无人使用,一般都是-。
  • 第三个字段是一个认证用户名,记录登录认证用的,和web业务上的登录不一样。
  • 第四个字段是一个组合的时间和时区,时间通过time.strftime("%d/%b/%Y:%H:%M:%S", time.localtime())可以搞定,生成的是当前的有序的时间。faker.time(pattern="%H:%M:%S", end_datetime=None)同样也可以生成时间,但是不添加额外代码无法保证生成的日志时间是有序的,不够贴近真实情况;时区可以直接写死,对于一个服务器来说不会有两种时区。
  • 第五个字段是一个组合的HTTP请求行,包括请求方式、请求路径、请求协议版本。请求方式一般有8种,‘GET’, ‘POST’, ‘PUT’, ‘HEAD’, ‘OPTIONS’, ‘DELETE’, ‘TRACE’, ‘CONNECT’,可以做一个随机选择,更逼真的可以使用加权随机给GET和POST加高比重;请求路径通过组合产生,生成URL路径使用faker.time.uri_path(),生成URL文件后缀faker.time.uri_extension(),组合起来会有很多变化;协议版本,协议基本定死为HTTP/1.1,远古的1.0很少看到。
  • 第六个字段是响应状态码字段。状态码常见的是200,302,403,404等,使用加权随机选择状态码,给予200较大的权重。
  • 第七个字段长度随机即可。注意个别的方法是不会有响应长度的,即响应长度为0,需要额外指定。

python3 代码

import random
import faker


def fake_weblog():
    f = faker.Faker()
    methods = ['GET', 'POST', 'PUT', 'HEAD', 'OPTIONS', 'DELETE', 'TRACE', 'CONNECT']
    method = methods[random.randint(0, len(methods) - 1)]
    status_code = 200
    length = random.randint(0, 10000)
    return f'{f.ipv4_public()} - - [{time.strftime("%d/%b/%Y:%H:%M:%S", time.localtime(time.time()))} +0800] {method} /{f.uri_path()}{f.uri_extension()} HTTP/1.1 {status_code} {length}'

print(fake_weblog())
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章