Python日志产生器

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)

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

[[email protected] 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文件:

[[email protected] project]$ vim log_generator.sh
python /home/hadoop/data/project/generate_log.py

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

[[email protected] 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秒产生十条日志信息

验证:

[[email protected] 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秒就会产生日志数据

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

原文地址:https://www.cnblogs.com/liuge36/p/9883016.html

时间: 2024-07-28 23:23:45

Python日志产生器的相关文章

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

好的日志对一个软件的重要性是显而易见的.如果函数的入口都要写一行代码来记录日志,这种方式实在是太低效了,但一直没有找到更好的方法.后来用python写一些软件,了解到python的装饰器功能时,突然人品爆发,结合装饰器来记录日志那是绝对的简单有效! 下面简单演示一下用装饰器来协助记录Log,示例代码如下: [python] view plain copy print? #!/usr/bin/env python def trace_func(func): ''''' A decorate fun

Python的修饰器@

修饰器是一个很著名的时机模式,经常用于有切面需求的场景,如插入日志.性能测试.事务处理等.修饰器能够很好地解决这些问题,有了修饰器我们能抽离出大量函数中与函数功能本身无关的雷同代码并继续使用.也就是说,修饰器的作用就是为已经存在的函数对象添加额外的功能. 1.修饰器入门: 1.1.需求的由来: 修饰器的定义很抽象,先来看一个例子: def foo():     print "in foo()"      foo() 这个函数的功能是打印出一窜字符窜.如果想要测试执行这个函数用了多长时间

【转】详解Python的装饰器

原文链接:http://python.jobbole.com/86717/ Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def say_hello(): print "hello!" def say_goodbye(): print "hello!" # bug here if __name__ == '__main__':

说说Python的装饰器模式与面向切面编程

说说Python的装饰器模式与面向切面编程 今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. 1. 装饰器入门 1.1. 需求是怎么来的? 装饰器的定义很是抽象,我们来看一个小例子. //edit http://www.lai18.com //date 2

Python札记 -- 装饰器

这几天花了点时间了解了下 Python的装饰器.其实以前在书上也看过有关的内容,不过当时不理解.今天把自己的一点体会写出来跟大家分享一下. 网上流传得比较广的,有关 python装饰器的文章有两篇,一篇是 CSDN上的,另外一篇是园子里的.附带链接如下:     http://blog.csdn.net/thy38/article/details/4471421     http://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html    

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

装饰器的基础 学习前提: 作用域 + 函数的理解 + 闭包  [学习,理解] 代码编写原则: 对修改开放对扩展开放 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象. 装饰器的应用:经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓存.权限校验等应用场景.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用. 装饰器作用:装饰器感觉就像是内部函数的

详解Python的装饰器

Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def say_hello(): print "hello!" def say_goodbye(): print "hello!" # bug here if __name__ == '__main__': say_hello() say_goodbye() 但是在实际调用中,我们

python之“装饰器”

在python里装饰器 其定义:装饰器就是一个函数,用来装饰其他函数,就是给其他函数添加功能. 装饰器有两个特点: 1.装饰器不修改被装饰函数的源码: 2.装饰器不锈钢被装饰函数的调用方式. 在编程中经常会有一些公共函数,在已经发布的程序中,为了程序的稳定性原函数是不允许随便修改其源代码的,并且合作开发中也不允许修改调用方式,那么如果要对原函数进行功能增加,怎么办呢?这时装饰器解决了这个问题. 装饰器用到的知识: 1.函数可以作为变量传递给另一个函数 2.函数的返回值也可以是另一个函数 装饰器实

进阶Python:装饰器 全面详解

进阶Python:装饰器 前言 前段时间我发了一篇讲解Python调试工具PySnooper的文章,在那篇文章开始一部分我简单的介绍了一下装饰器,文章发出之后有几位同学说"终于了解装饰器的用法了",可见有不少同学对装饰器感兴趣.但是那篇文章主要的目的是在介绍PySnooper,所以没有太深入的展开讲解装饰器,于是在这里就详细的介绍一些装饰器的使用. 装饰器是Python中非常重要的一个概念,如果你会Python的基本语法,你可以写出能够跑通的代码,但是如果你想写出高效.简洁的代码,我认