Python日志产生器

写在前面

有的时候,可能就是我们做实时数据收集的时候,会有一个头疼的问题就是,你会发现,你可能一下子,没有日志的数据源。所以,我们可以简单使用python脚本来实现产生实时的数据,这样就很方便了

在编写代码之前,我们得知道我们的webserver日志到底长什么样,下面我找了一段的nginx服务器上真实日志,作为样例:

223.104.25.1 - - [21/Nov/2017:20:34:16 +0800] "GET / HTTP/1.1" 200 94 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.0 Mobile/14G60 Safari/602.1" "-"
223.104.25.1 - - [21/Nov/2017:20:34:16 +0800] "GET / HTTP/1.1" 200 94 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.0 Mobile/14G60 Safari/602.1" "-"
156.151.199.137 - - [21/Nov/2017:20:34:19 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36" "-"

从上面的服务器日志中我们可以看见,主要的字段有:

1.访问的ip地址156.151.199.137

2.访问的时间/时区 [21/Nov/2017:20:34:19 +0800]

3.状态码,

4.useragent 信息等

接下来,我们就开始来开发模拟的日志产生器

思路??

开发的pyhton日志产生器中包括:请求的URL、ip、referer和状态码等信息。

实现,这里直接贴上代码python:

#coding=UTF-8

import random
import time url_paths = [
"class/154.html",
"class/128.html",
"class/147.html",
"class/116.html",
"class/138.html",
"class/140.html",
"learn/828",
"learn/521",
"course/list"
] ip_slices = [127,156,222,105,24,192,153,127,31,168,32,10,82,77,118,228] http_referers = [
"http://www.baidu.com/s?wd={query}",
"https://www.sogou.com/web?query={query}",
"http://cn.bing.com/search?q={query}",
"https://search.yahoo.com/search?p={query}",
] search_keyword = [
"Spark 项目实战",
"Hadoop 项目实战",
"Storm 项目实战",
"Spark Streaming实战",
"古诗词鉴赏"
] status_codes = ["200","404","500","503","403"] def sample_url():
return random.sample(url_paths, 1)[0] def sample_ip():
slice = random.sample(ip_slices , 4)
return ".".join([str(item) for item in slice]) def sample_referer():
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]) 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()) f = open("/home/hadoop/data/project/logs/access.log","w+") while count >= 1:
query_log = "{ip}\t{local_time}\t\"GET /{url} HTTP/1.1\"\t{status_code}\t{referer}".format(url=sample_url(), ip=sample_ip(), referer=sample_referer(), status_code=sample_status_code(),local_time=time_str) f.write(query_log + "\n") count = count - 1 if __name__ == '__main__':
generate_log(10)

这样我们就能够实现日志的产生,测试:

[hadoop@hadoop000 logs]$ more access.log
105.228.77.82 2017-11-21 06:38:01 "GET /learn/828 HTTP/1.1" 200 -
31.10.153.77 2017-11-21 06:38:01 "GET /class/138.html HTTP/1.1" 200 -
77.156.153.105 2017-11-21 06:38:01 "GET /class/140.html HTTP/1.1" 503 http://www.bai
du.com/s?wd=Storm 项目实战
222.32.228.77 2017-11-21 06:38:01 "GET /learn/521 HTTP/1.1" 404 https://www.so
gou.com/web?query=Spark 项目实战
#产生的部分

数据可以产生了,接下来我们要实现数据的实时产生了,这里就是需要使用到linux里面的Crontab执行计划了。相信学过linux的人,肯定会知道。我们编写一个执行计划就好。

推荐一个测试工具网站:

https://tool.lu/crontab

1)先写一个执行计划的执行脚本。new一个.sh文件:

[hadoop@hadoop000 project]$ vim log_generator.sh
python /home/hadoop/data/project/generate_log.py

2)写好之后,就可以写我们的执行计划了

[hadoop@hadoop000 project]$ crontab -e
* * * * * /home/hadoop/data/project/log_generator.sh * * * * * sleep 10; /home/hadoop/data/project/log_generator.sh * * * * * sleep 20; /home/hadoop/data/project/log_generator.sh * * * * * sleep 30; /home/hadoop/data/project/log_generator.sh * * * * * sleep 40; /home/hadoop/data/project/log_generator.sh * * * * * sleep 50; /home/hadoop/data/project/log_generator.sh

这样,我们的执行计划就设计好了,我们这里设计的是每10秒执行一次

,即每10秒产生十条日志信息

验证:

[hadoop@hadoop000 logs]$ tail -f access.log
222.153.118.82 2017-11-21 06:45:01 "GET /class/147.html HTTP/1.1" 403 -
127.192.168.31 2017-11-21 06:45:01 "GET /class/138.html HTTP/1.1" 200 -
77.31.153.127 2017-11-21 06:45:01 "GET /class/116.html HTTP/1.1" 403 https://search.yahoo.com/search?p=Spark Streaming实战
153.10.82.192 2017-11-21 06:45:01 "GET /class/147.html HTTP/1.1" 404 -
168.32.153.222 2017-11-21 06:45:01 "GET /learn/828 HTTP/1.1" 503 -
118.153.222.192 2017-11-21 06:45:01 "GET /class/128.html HTTP/1.1" 503 -
192.32.156.31 2017-11-21 06:45:01 "GET /class/147.html HTTP/1.1" 500 https://search.yahoo.com/search?p=Spark 项目实战
127.192.82.228 2017-11-21 06:45:01 "GET /class/154.html HTTP/1.1" 403 -
118.31.222.105 2017-11-21 06:45:01 "GET /learn/521 HTTP/1.1" 503 -
127.127.168.228 2017-11-21 06:45:01 "GET /class/140.html HTTP/1.1" 200 -
tail: access.log: file truncated
228.10.153.192 2017-11-21 06:56:01 "GET /class/147.html HTTP/1.1" 500 -
10.168.156.31 2017-11-21 06:56:01 "GET /course/list HTTP/1.1" 403 -
192.153.222.77 2017-11-21 06:56:01 "GET /class/154.html HTTP/1.1" 200 -
153.32.105.82 2017-11-21 06:56:01 "GET /course/list HTTP/1.1" 500 http://www.baidu.com/s?wd=Spark 项目实战

上面是部分截取,可以观察到,每隔10秒就会产生日志数据

接下来,我们就可以来使用这个日志产生器来实时产生我们需要的日志信息了。

Python日志产生器的更多相关文章

  1. python日志装饰器实现

    问题出自:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143184355 ...

  2. 【Python】装饰器实现日志记录

    好的日志对一个软件的重要性是显而易见的.如果函数的入口都要写一行代码来记录日志,这种方式实在是太低效了,但一直没有找到更好的方法.后来用python写一些软件,了解到python的装饰器功能时,突然人 ...

  3. python基础——装饰器

    python基础——装饰器 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. >>> def now(): ... print('2015-3-25 ...

  4. 【转】详解Python的装饰器

    原文链接:http://python.jobbole.com/86717/ Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现 ...

  5. 理解Python中的装饰器//这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档

    转自:http://www.cnblogs.com/rollenholt/archive/2012/05/02/2479833.html 这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档 ...

  6. 详解Python的装饰器

    Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def sa ...

  7. Python学习---装饰器的学习1210

    装饰器的基础 学习前提: 作用域 + 函数的理解 + 闭包  [学习,理解] 代码编写原则: 对修改开放对扩展开放 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前 ...

  8. python日志模块笔记

    前言 在应用中记录日志是程序开发的重要一环,也是调试的重要工具.但却很容易让人忽略.之前用flask写的一个服务就因为没有处理好日志的问题导致线上的错误难以察觉,修复错误的定位也很困难.最近恰好有时间 ...

  9. Python的装饰器实例用法小结

    这篇文章主要介绍了Python装饰器用法,结合实例形式总结分析了Python常用装饰器的概念.功能.使用方法及相关注意事项 一.装饰器是什么 python的装饰器本质上是一个Python函数,它可以让 ...

随机推荐

  1. 90002CAD相关操作

    第一章   初识CAD 1.1 CAD能干什么 (1)绘制机械图/建筑图/装修图等二维复杂工程图的不二之选.二维设计软件的王者. (2)CAD可以绘制平面图.轴测图(二维线框表示三维图形).立体图(三 ...

  2. Java利用Apache poi导出图表

    jar compile('org.apache.poi:poi:4.0.1') compile('org.apache.poi:poi-scratchpad:4.0.1') compile('org. ...

  3. 设计模式(C#)——09外观模式

    推荐阅读:  我的CSDN  我的博客园  QQ群:704621321 前言       在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然 ...

  4. Javaweb Cookie机制

    Javaweb Cookie机制 一.前言 HTTP协议是一种无状态的协议,WEB服务器本身不能识别出哪些请求是同一个浏览器发出的 ,浏览器的每一次请求都是完全孤立的,即使 HTTP1.1 支持持续连 ...

  5. JSONP跨域的script标签请求为什么不受同源策略的限制?

    在复习跨域的时候,复习到了JSONP跨域,大家都知道JSONP跨域是通过动态创建script标签,然后通过其src属性进行跨域请求的,前端需要一个数据处理的回调函数,而服务端需要配合执行回调函数,放入 ...

  6. BZOJ-2535 航空管制 toposort

    题目传送门 题解: 如果正着连边,可以发现最困难的点是ti不好处理. 所以我们连反边,然后将ti转换成前面有n-ti+1架飞机起飞了作为限制条件. 对于第一问,直接toposort 然后反着输出求出的 ...

  7. PAT 天梯杯 L2-020 功夫传人

    L2-020. 功夫传人 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 一门武功能否传承久远并被发扬光大,是要看缘分的.一般来 ...

  8. CCPC-Wannafly Camp #4(部分解题报告)

    B: 电音之王 时间限制: 7 Sec  内存限制: 1024 MB 第一次听说快速乘法,记录一下,用的大佬的板子 #include<bits/stdc++.h> #define LL l ...

  9. 【1】KNN(K-nearest neighbors algorithm)

    基本原理 KNN算法又叫最近邻居法,是一种非常简单易于掌握的分类算法. 其基本原理是,存在一个已知标签的数据集合,也就是训练样本集. 这个样本集中的每一个数据所属的分类都是已知的. 当一个没有标签的新 ...

  10. centos 6.5 搭建DHCP实验

    搭建DHCP服务 安装DHCP服务 挂载光盘:mount /dev/cdrom /qswz 从光盘的安装包中安装DHCP rpm -ivh dhcp-4.1.1-38.P1.el6.centos.i6 ...