利用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())
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章