Python 日志生成器

需求分析

网站日志需求分析

由于缺乏真实网站日志,在这里用 Python 2.7.5 构建日志生成器模拟网站日志,作为之后实验的基础。

之后的实验为用 Flume 采集网站的日志信息,基于此做一系列的处理。

为搭建好网站之后采集真实网站日志信息做准备。

数据集需求分析

由于缺乏有效的 ALS 数据集做为模型的训练与测试,在这里用 Python 2.7.5 构建日志生成器模拟数据集。

Spark Streaming + ALS 推荐系统的模型的训练与测试做准备

环境说明

系统: CentOS 7.2 mini

Python 版本: 2.7.5

(PS: PythonCentOS 7.2 mini 自带的,可通过 python --version 来查看 Python 的版本,注意 Python 2.X 和 Python 3.X 存在很大的区别,这里采用的是系统自带的 Python 2.7.5)

Python 日志生成器的编写

网站日志生成器的编写

格式可根据实际需求做出调整

generate_log.py 如下:

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#coding=UTF-8

import random
import time

#从什么搜索引擎跳转过来的
http_referers = [
"http://www.baidu.com/s?wd={query}",
"https://www.google.com/search?q={query}",
"https://www.sougou.com/web?query={query}",
"http://cn.bing.com/search?q={query}",
"https://search.yahoo.com/search?p={query}"
]

#搜索关键字
search_keyword = [
"鸡排饭",
"虾排饭",
"芒果布丁",
"海鲜自助",
"水果拼盘",
"黄焖鸡米饭",
"西红柿牛腩面"
]

#网站链接路径
url_path = [
"class/111.html",
"class/112.html",
"class/113.html",
"class/114.html",
"class/115.html",
"class/116.html",
"anyway/666",
"NoBUG/666"
]

#ip地址
ip_slices = [10,123,132,125,168,187,25,66,37,168,131,86,53,19,163]

#状态码
status_codes = ["200","404","500"]


#sample(seq, n)从序列seq中选择n个随机且独立的元素

#随机生成一个带refer和keyword的url
def sample_refer():
if random.uniform(0, 1) > 0.2:
return "_"

refer_str = random.sample(http_referers, 1)
query_str = random.sample(search_keyword, 1)
return refer_str[0].format(query=query_str[0])

#随机生成一个url
def sample_url():
return random.sample(url_path,1)[0]

#随机生成一个ip
def sample_ip():
slice = random.sample(ip_slices,4)
return ".".join([str(item) for item in slice])

#随机生成一个状态码
def sample_status_code():
return random.sample(status_codes,1)[0]


def generate_log(count = 10):
#获取本地时间
time_str = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())

#打开access.log文件,并赋予 f 写的权限
#w+为消除文件内容,然后以读写方式打开文件。
#a+为以读写方式打开文件,并把文件指针移到文件尾
#为了将数据连续的写入文件采用 a+
#f = open("/abs/project/data/log/access.log","w+")
f = open("/abs/project/data/log/access.log","a+")

while count >=1:
query_log="{ip}\t{local_time}\t\"GET /{url} HTTP/1.1\"\t{status_code}\t{refer}".format(local_time=time_str,url=sample_url(),ip=sample_ip(),refer=sample_refer(),status_code=sample_status_code())
#测试时输出到控制台,在实际使用中是将他存入相应的文件中
#print query_log

#将日志输入到access.log
f.write(query_log + "\n")

count = count - 1

if __name__ == '__main__':
generate_log()

数据集生成器的编写

我们所需要的数据集的格式为:   user_id::food_id::food_rating

可根据实际需求做出调整

generate_dataset.py 如下:

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
#coding=UTF-8

import random

#食物id
food_id = [1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,
1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,
1021,1022,1023,1024,1025,1026,1027,1028,1029,1030]

#用户id
user_id = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]

#用户对食物的评价
food_rating = [1,2,3,4,5]


#sample(seq, n)从序列seq中选择n个随机且独立的元素
#随机生成一个food
def sample_food():
return random.sample(food_id, 1)[0]

#随机生成一个用户
def sample_user():
return random.sample(user_id, 1)[0]

#随机生成一个食物评价
def sample_foodrating():
return random.sample(food_rating, 1)[0]

def generate_dataset(count = 10):

#打开rating文件,并赋予 f 写的权限
#w+为消除文件内容,然后以读写方式打开文件。
#a+为以读写方式打开文件,并把文件指针移到文件尾
#为了将数据连续的写入文件采用 a+
#f = open("/abs/project/data/dataset/rating","w+")
f = open("/abs/project/data/dataset/rating","a+")

while count >=1:
#query_log="{food}\t{user}\t{foodrating}".format(food=sample_food(),user=sample_user(),foodrating=sample_foodrating())
query_log="{food}::{user}::{foodrating}".format(food=sample_food(),user=sample_user(),foodrating=sample_foodrating())
#测试时输出到控制台,在实际使用中是将他存入相应的文件中
#print query_log

#将日志输入到rating
f.write(query_log + "\n")

count = count - 1

if __name__ == '__main__':
generate_dataset()

扩展

定时执行工具

Linux    crontab

  网站:  http://tool.lu/crontab

  参照介绍可以得出每隔1分钟执行一次的 crontab 表达式   */1****

/abs/project 目录中新建日志生成器脚本 log_generator.sh

1
2
3
4
# 新建日志生成器脚本 log_generator.sh
vi log_generator.sh

python /abs/lib/generate_log.py

新打开一个界面,然后查看输出 tail -200f /abs/project/data/log/access.log

log_generator.sh 增加可执行权限 chmod u+x log_generator.sh

执行脚本 ./log_generator.sh

配置 crontab

1
2
3
4
5
6
7
8
9
10
11
# 配置 crontab
crontab -e

# 每隔1分钟执行一次 log_generator.sh
*/1 * * * * /abs/project/log_generator.sh

# 查看 crontab
crontab -l

# 删除 crontab
crontab -r

小结

学会了用 Python 实现日志生成器的代码编写,并在此基础上进行相关拓展

学会了周期性执行任务的守护进程 crontab 的基本操作与使用

------ 本文结束------
如果对您有帮助的话请我喝瓶水吧!