基于Python实现WEB日志生成

2022-11-12 16:07:55 浏览数 (1)

文章目录

  • 基于Python实现WEB日志生成
    • 1.日志作用
    • 2.常见的web服务器日志介绍
      • 2.1Apache
      • 2.2Ngnix
    • 3.基于python实现日志生成
      • 3.1加载依赖
      • 3.2定义随机生成的日志信息
        • 随机生成 IP地址
        • 随机生成 访问资源路径
        • 随机生成 状态码
        • 随机生成 来源地址
        • 随机生成 浏览器信息
      • 3.3生成log数据
    • 总结
    • 参考文献

基于Python实现WEB日志生成

1.日志作用

记录访问服务器的远程主机IP地址,可以得知浏览者来自何处 记录浏览者访问web资源,可以了解网站哪些部分最受欢迎 记录浏览者使用浏览器,可以根据大多数浏览者使用浏览器对站点进行优化 记录浏览者访问时间

2.常见的web服务器日志介绍

2.1Apache

1.简介 Apache(音译为阿帕奇)是世界使用最多的Web服务器软件之一。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。Apache是用C语言开发的基于模块化设计的web应用,核心代码不多。多数功能分散在各个模块中

2.日志位置 Apache的配置文件(httpd.conf)中是存在着两个可调配的日志文件的,这两个日志文件分别是访问日志access_log(在Windows上是access.log)和错误日志error_log(在Windows上是error.log)。如果使用 SSL 服务的话,还可能存在 ssl_access_log和ssl_error_log 和 ssl_request_log 三种日志文件。日志文件的路径根据安装方式不同位置也是不一样的,一般都是在Apache安装目录的logs子目录中

默认安装的情况下,Apache的配置文件是在:

windows: C:Program FilesApache Software FoundationApache2.4confhttpd.conf linux: etc/httpd/conf/httpd.conf

3.Apache访问日志格式详解

访问日志access_log记录了所有对Web服务器的访问活动,下面是访问日志access_log中的一个标准记录

192.168.115.5 - - [01/Apr/2018:10:37:19 0800] “GET / HTTP/1.1” 200 45

日志字段所代表的内容如下:

1.远程主机IP:表明访问网站的是谁 2.空白(E-mail):为了避免用户的邮箱被垃圾邮件骚扰,第二项就用“-”取代了 3.空白(登录名):用于记录浏览者进行身份验证时提供的名字。 4.请求时间:用方括号包围,而且采用“公用日志格式”或者“标准英文格式”。 时间信息最后的“ 0800”表示服务器所处时区位于UTC之后的8小时。 5.方法 资源 协议:服务器收到的是一个什么样的请求。该项信息的典型格式是“METHOD RESOURCE PROTOCOL”,即“方法 资源 协议”。 METHOD: GET、POST、HEAD、…… RESOURCE: /、index.html、/default/index.php、……(请求的文件) PROTOCOL: HTTP 版本号 6.状态代码:请求是否成功,或者遇到了什么样的错误。大多数时候,这项值是200,它表示服务器已经成功地响应浏览器的请求,一切正常。 7.发送字节数:表示发送给客户端的总字节数。它告诉我们传输是否被打断(该数值是否和文件的大小相同)。把日志记录中的这些值加起来就可以得知服务器在一天、一周或者一月内发送了多少数据。

2.2Ngnix

1.简介 Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;Nginx可以作为一个HTTP服务器进行网站的发布处理,另外Nginx可以作为反向代理进行负载均衡的实现。

2.日志位置 Nginx日志对于统计、系统服务排错很有用。Nginx日志主要分为两种:access_log(访问日志)和error_log(错误日志)。通过访问日志我们可以得到用户的IP地址、浏览器的信息,请求的处理时间等信息。错误日志记录了访问出错的信息,可以帮助我们定位错误的原因。 nginx服务器日志相关指令主要有两条,一条是log_format,用来设置日志格式,另外一条是access_log,用来指定日志文件的存放路径、格式和缓存大小,一般在nginx的配置文件中日记配置(/usr/local/nginx/conf/nginx.conf)。

查找Nginx.conf的位置: 执行 sudo nginx -t 就可以获取配置文件的路径。同时如果你的配置文件nginx.conf修改后有错,该命令执行后也会有相应提示,例如“参数无效” Nginx日志路径

/var/log/nginx

3.ngnix日志格式设置 nginx的log_format有很多可选的参数用于指示服务器的活动状态,默认的是:

代码语言:javascript复制
log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '
            '$status $body_bytes_sent "$http_referer" '
            '"$http_user_agent" "$http_x_forwarded_for"';

想要记录更详细的信息需要自己设置log_format,具体可设置的参数格式及说明如下:

Nginx日志格式设置,参考https://blog.51cto.com/shaoniana/2126541

3.基于python实现日志生成

本案例为基于python语言实现web访问日志的加载,打开jupyter,新建

代码语言:javascript复制
日志生成.ipynb

进行代码编写。

3.1加载依赖

代码语言:javascript复制
import random
import time
import shutil
import os
os.chdir("./") #切换工作路径为当前目录

3.2定义随机生成的日志信息

随机生成 IP地址
代码语言:javascript复制
ip_slices = [132, 156, 124, 10, 29, 167, 143, 187, 30, 100]
def sample_ip():
    slice = random.sample(ip_slices, 4)
    return ".".join([str(item) for item in slice])
随机生成 访问资源路径
代码语言:javascript复制
url_paths = [
    "www/2",
    "www/1",
    "www/6",
    "www/4",
    "www/3",
    "pianhua/130",
    "toukouxu/821"
]

def sample_url():
    return random.sample(url_paths, 1)[0]
随机生成 状态码
代码语言:javascript复制
status_code = [404, 302, 200]
def sample_status():
    return random.sample(status_code, 1)[0]
随机生成 来源地址
代码语言:javascript复制
http_referers = [
    "https://www.baidu.com/s?wd={query}",
    "https://www.sogou.com/web?qu={query}",
    "http://cn.bing.com/search?q={query}",
    "https://www.so.com/s?q={query}"
]
search_keyword = [
    "我的祖国",
    "西游降魔篇",
    "阿甘正传",
    "扬名立万",
    "杨恩泽"
]
def sample_referer():
    if random.uniform(0, 1) > 0.2:
        return "-"
    refer_str = random.sample(http_referers, 1)
    # print refer_str[0]
    query_str = random.sample(search_keyword, 1)
    # print query_str[0]
    return refer_str[0].format(query=query_str[0])
随机生成 浏览器信息

生成userAgent数据: 创建日志文件userAgentcopy文件,notepad 打开该文件,将以下useragent信息粘贴到userAgentcopy中

代码语言:javascript复制
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"
"Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11"
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6"
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6"
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1"
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5"
"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5"
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3"
"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3"
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3"
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3"
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3"
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3"
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3"
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3"
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3"
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
"Mozilla/5.0 (Macintosh; U; Mac OS X Mach-O; en-US; rv:2.0a) Gecko/20040614 Firefox/3.0.0 "
"Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.0.3) Gecko/2008092414 Firefox/3.0.3"
"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1) Gecko/20090624 Firefox/3.5"
"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.14) Gecko/20110218 AlexaToolbar/alxf-2.0 Firefox/3.6.14"
"Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15"
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101"
"Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11"
"Opera/9.80 (Android 2.3.4; Linux; Opera mobi/adr-1107051709; U; zh-cn) Presto/2.8.149 Version/11.10"
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10"
"Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/533.17.8 (KHTML, like Gecko) Version/5.0.1 Safari/533.17.8"
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5"
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0"
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)"
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"

将userAgentcopy上传到jupyter中日志生成文件所在的同级目录下。

读取userAgentcopy文件并加载到列表中,代码如下:

代码语言:javascript复制
# 读取userAgentcopy文件中的内容,生成一个userAgentlist列表
userAgentlist = []
with open("userAgentcopy",'r',encoding="UTF-8") as f:
    for line in f.readlines():
        line = line.replace(""","")
        line = line.replace("n","")
        userAgentlist.append(line)
# 随机useragent
def useragent():
    return random.sample(userAgentlist,1)

3.3生成log数据

代码语言:javascript复制
# 生成当前时间
def get_timestamp():
    t = time.localtime()
    return time.strftime('%Y-%m-%d %H:%M:%S', t)
    
# 产生log
def generate_log(count=100,filepath="log",filename="log.txt"):
    
    # 日志目录
    log_path = os.path.join(os.getcwd(),filepath)
    # 日志文件路径
    log_name = os.path.join(log_path,filename)
    # 判断日志所在目录是否存在
    if not os.path.exists(log_path):
        os.mkdir(log_path)
        print(log_path,"已创建")
    elif os.path.exists(log_path) and os.path.exists(log_name):
        # 如果日志存在,先删除
        print(log_name,"已存在")
        # os.remove(log_name)
        # shutil.rmtree(log_name)
    # 打开日志
    with open(log_name,"a ") as f :
        # 生成日志
        while count >= 1:
            # 获取当前时间
            time_str = get_timestamp()
            # 定义日志格式
            log_format = "{ip}t{localtime}t"GET {url} HTTP/1.0"t{referece}t{status1}t{useragent}"
            # 生成日志信息
            query_log = log_format.format(
                ip=sample_ip(),
                url=sample_url(),
                status1=sample_status(),
                referece=sample_referer(),
                localtime=time_str,
                useragent = useragent()
                )
            # 将日志写入文件
            f.write(query_log   "n")
            count = count - 1;
            # 随机休眠
            time.sleep(random.uniform(0,2))
            # time.sleep(0.5)
 

if __name__ == '__main__':
    generate_log(count=50,filepath="log",filename="log1.txt")

总结

本文主要介绍常见的web服务器与web日志的格式,并基于python实现了随机日志生成。在实现过程中,主要解决了userAgent的随机生成,本地时间的动态生成。

参考文献

https://blog.51cto.com/shaoniana/2126541 https://blog.csdn.net/qq_41861558/article/details/105252105

0 人点赞