如何用 python 分析网站日志

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用 python 分析网站日志相关的知识,希望对你有一定的参考价值。

日志的记录

Python有一个logging模块,可以用来产生日志。
(1)学习资料
http://blog.sina.com.cn/s/blog_4b5039210100f1wv.html

http://blog.donews.com/limodou/archive/2005/02/16/278699.aspx
http://kenby.iteye.com/blog/1162698
http://blog.csdn.NET/fxjtoday/article/details/6307285
前边几篇文章仅仅是其它人的简单学习经验,下边这个链接中的内容比较全面。

http://www.red-dove.com/logging/index.html

(2)我需要关注内容
日志信息输出级别
logging模块提供了多种日志级别,如:NOTSET(0),DEBUG(10),
INFO(20),WARNING(30),WARNING(40),CRITICAL(50)。
设置方法:
logger = getLogger()
logger.serLevel(logging.DEBUG)

日志数据格式
使用Formatter设置日志的输出格式。
设置方法:
logger = getLogger()
handler = loggingFileHandler(XXX)
formatter = logging.Formatter("%(asctime)s %(levelname) %(message)s","%Y-%m-%d,%H:%M:%S")

%(asctime)s表示记录日志写入时间,"%Y-%m-%d,%H:%M:%S“设定了时间的具体写入格式。
%(levelname)s表示记录日志的级别。
%(message)s表示记录日志的具体内容。

日志对象初始化
def initLog():
logger = logging.getLogger()
handler = logging.FileHandler("日志保存路径")
formatter = logging.Formatter("%(asctime)s %(levelname) %(message)s","%Y-%m-%d,%H:%M:%S")
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel

写日志
logging.getLogger().info(), logging.getLogger().debug()......

2. 日志的分析。
(1)我的日志的内容。(log.txt)
2011-12-12,12:11:31 INFO Client1: 4356175.0 1.32366309133e+12 1.32366309134e+12
2011-12-12,12:11:33 INFO Client1: 4361320.0 1.32366309334e+12 1.32366309336e+12
2011-12-12,12:11:33 INFO Client0: 4361320.0 1.32366309389e+12 1.32366309391e+12
2011-12-12,12:11:39 INFO Client1: 4366364.0 1.32366309934e+12 1.32366309936e+12
2011-12-12,12:11:39 INFO Client0: 4366364.0 1.32366309989e+12 1.32366309991e+12
2011-12-12,12:11:43 INFO Client1: 4371416.0 1.32366310334e+12 1.32366310336e+12
2011-12-12,12:11:43 INFO Client0: 4371416.0 1.32366310389e+12 1.32366310391e+12
2011-12-12,12:11:49 INFO Client1: 4376450.0 1.32366310934e+12 1.32366310936e+12
我需要将上述内容逐行读出,并将三个时间戳提取出来,然后将其图形化。

(2) 文件操作以及字符串的分析。
打开文件,读取出一行日志。
file = file("日志路径",“r”)
while True:
line = file.readline()
if len(len) == 0:
break;
print line
file.close()

从字符串中提取数据。
字符串操作学习资料:

http://reader.youdao.com/sharelite?itemId=-4646262544179865983&method=viewSharedItemThroughLink&sharedBy=-1137845767117085734
从上面展示出来的日志内容可见,主要数据都是用空格分隔,所以需要使用字符串的
split函数对字符串进行分割:
paraList = line.split(),该函数默认的分割符是空格,返回值为一个list。
paraList[3], paraList[4], paraList[5]中分别以字符串形式存储着我需要的时间戳。

使用float(paraList[3])将字符串转化为浮点数。
(3)将日志图形化。
matplotlib是python的一个绘图库。我打算用它来将日志图形化。
matplotlib学习资料。
matplotlib的下载与安装:
http://yexin218.iteye.com/blog/645894
http://blog.csdn.Net/sharkw/article/details/1924949

对matplotlib的宏观介绍:
http://apps.hi.baidu.com/share/detail/21928578
对matplotlib具体使用的详细介绍:

http://blog.sina.com.cn/s/blog_4b5039210100ie6a.html
在matplotlib中设置线条的颜色和形状:
http://blog.csdn.net/kkxgx/article/details/python

如果想对matplotlib有一个全面的了解,就需要阅读教程《Matplotlib for Python developers》,教程下载地址:
http://download.csdn.net/detail/nmgfrank/4006691

使用实例
import matplotlib.pyplot as plt

listX = [] #保存X轴数据
listY = [] #保存Y轴数据
listY1 = [] #保存Y轴数据

file = file("../log.txt","r")#打开日志文件

while True:
line = file.readline()#读取一行日志
if len(line) == 0:#如果到达日志末尾,退出
break
paraList = line.split()
print paraList[2]
print paraList[3]
print paraList[4]
print paraList[5]
if paraList[2] == "Client0:": #在坐标图中添加两个点,它们的X轴数值是相同的
listX.append(float(paraList[3]))
listY.append(float(paraList[5]) - float(paraList[3]))
listY1.append(float(paraList[4]) - float(paraList[3]))

file.close()

plt.plot(listX,listY,\'bo-\',listX,listY1,\'ro\')#画图
plt.title(\'tile\')#设置所绘图像的标题
plt.xlabel(\'time in sec\')#设置x轴名称
plt.ylabel(\'delays in ms\'\')#设置y轴名称

plt.show()
参考技术A #coding:utf-8
#file: FileSplit.py

import os,os.path,time

def FileSplit(sourceFile, targetFolder):
sFile = open(sourceFile, 'r')
number = 100000 #每个小文件中保存100000条数据
dataLine = sFile.readline()
tempData = [] #缓存列表
fileNum = 1
if not os.path.isdir(targetFolder): #如果目标目录不存在,则创建
os.mkdir(targetFolder)
while dataLine: #有数据
for row in range(number):
tempData.append(dataLine) #将一行数据添加到列表中
dataLine = sFile.readline()
if not dataLine :
break
tFilename = os.path.join(targetFolder,os.path.split(sourceFile)[1] + str(fileNum) + ".txt")
tFile = open(tFilename, 'a+') #创建小文件
tFile.writelines(tempData) #将列表保存到文件中
tFile.close()
tempData = [] #清空缓存列表
print(tFilename + " 创建于: " + str(time.ctime()))
fileNum += 1 #文件编号

sFile.close()
#coding:utf-8
#file: Map.py

import os,os.path,re

def Map(sourceFile, targetFolder):
sFile = open(sourceFile, 'r')
dataLine = sFile.readline()
tempData = #缓存列表
if not os.path.isdir(targetFolder): #如果目标目录不存在,则创建
os.mkdir(targetFolder)
while dataLine: #有数据
p_re = re.compile(r'(GET|POST)\s(.*?)\sHTTP/1.[01]',re.IGNORECASE) #用正则表达式解析数据
match = p_re.findall(dataLine)
if match:
visitUrl = match[0][1]
if visitUrl in tempData:
tempData[visitUrl] += 1
else:
tempData[visitUrl] = 1
dataLine = sFile.readline() #读入下一行数据

sFile.close()

tList = []
for key,value in sorted(tempData.items(),key = lambda k:k[1],reverse = True):
tList.append(key + " " + str(value) + '\n')

tFilename = os.path.join(targetFolder,os.path.split(sourceFile)[1] + "_map.txt")
tFile = open(tFilename, 'a+') #创建小文件
tFile.writelines(tList) #将列表保存到文件中
tFile.close()

if __name__ == "__main__" :
Map("access\\access.log1.txt","access")
Map("access\\access.log2.txt","access")
Map("access\\access.log3.txt","access")
if __name__ == "__main__" :
FileSplit("access.log","access")
#coding:utf-8
#file: Reduce.py

import os,os.path,re

def Reduce(sourceFolder, targetFile):
tempData = #缓存列表
p_re = re.compile(r'(.*?)(\d1,$)',re.IGNORECASE) #用正则表达式解析数据
for root,dirs,files in os.walk(sourceFolder):
for fil in files:
if fil.endswith('_map.txt'): #是reduce文件
sFile = open(os.path.abspath(os.path.join(root,fil)), 'r')
dataLine = sFile.readline()

while dataLine: #有数据
subdata = p_re.findall(dataLine) #用空格分割数据
#print(subdata[0][0]," ",subdata[0][1])
if subdata[0][0] in tempData:
tempData[subdata[0][0]] += int(subdata[0][1])
else:
tempData[subdata[0][0]] = int(subdata[0][1])
dataLine = sFile.readline() #读入下一行数据

sFile.close()

tList = []
for key,value in sorted(tempData.items(),key = lambda k:k[1],reverse = True):
tList.append(key + " " + str(value) + '\n')

tFilename = os.path.join(sourceFolder,targetFile + "_reduce.txt")
tFile = open(tFilename, 'a+') #创建小文件
tFile.writelines(tList) #将列表保存到文件中
tFile.close()

if __name__ == "__main__" :
Reduce("access","access")

如何用Python 3 搭建网站?

一、用Python3搭建网站有三种常见的方法:

  1. 使用Web框架,如 Django、Flask: 这种方法提供了一个完整的Web开发框架,包含了模型、视图、控制器等功能,使用起来方便快捷。 Django是一个功能强大的框架,适合大型项目;Flask是一个轻量级的框架,适合小型项目。
  2. 使用模板,如 Jinja: 这种方法允许您使用HTML模板以编写动态Web页面,并通过Python代码动态渲染数据。
  3. 手写代码,使用库,如 Flask、Tornado、Web.py: 这种方法要求您编写所有代码,包括请求处理、响应生成等。这种方法比较灵活,但需要更多的代码量。

二、跟我一起了解下,这三种常见方法的特点

使用Web框架,如Django、Flask:

  • 优点:
    • 功能强大,提供了一套完整的Web开发流程,使用方便。
    • 可以快速构建应用,提高开发效率。
    • 支持许多第三方库,方便扩展。
  • 缺点:
    • 学习曲线较高,需要了解一定的Web开发知识。
    • 不适合小型项目。

使用模板,如 Jinja:

  • 优点:
    • 模板易于编写,容易理解。
    • 灵活,可以根据需求自定义模板。
    • 适合小型项目。
  • 缺点:
    • 不支持许多功能,如数据验证、安全等,需要自行实现。

手写代码,使用库,如 Flask、Tornado、Web.py:

  • 优点:
    • 灵活,可以根据需求自定义代码。
    • 适合小型项目。
  • 缺点:
    • 需要编写大量代码,开发效率较低。
    • 不支持许多功能,如数据验证、安全等,需要自行实现。

⚠️所以要根据项目需求选择合适的方法进行学习,学习你可以通过两种方式。【第一:通过视频课程进行学习】【第二:通过中文文档地址进行学习】。

三、学习资源分享

没有Python基础的,看这里:

黑马程序员python教程,8天python从入门到精通,学python看这套就够了_哔哩哔哩_bilibili​www.bilibili.com/video/BV1qW4y1a7fU/?spm_id_from=333.999.0.0正在上传…重新上传取消https://link.zhihu.com/?target=https%3A//www.bilibili.com/video/BV1qW4y1a7fU/%3Fspm_id_from%3D333.999.0.0

有基础的,想要玩转web开发,看这里,实战!

黑马程序员python企业级开发项目-手把手从0到1开发《美多商城》​www.bilibili.com/video/BV1nf4y1k7G3/正在上传…重新上传取消https://link.zhihu.com/?target=https%3A//www.bilibili.com/video/BV1nf4y1k7G3/

四、官方文档

有自学能力的,觉得不需要老师带着的小伙伴,中文文档给大家整理了:

Django文档:https://docs.djangoproject.com/zh-hans/3.2/

Flask文档:http://docs.jinkan.org/docs/flask/

Jinja文档:https://jinja.palletsprojects.com/en/2.11.x/

Flask和Tornado文档:https://docs.python.org/zh-cn/3/library/index.html

Web.py文档:http://webpy.org/docs/0.3/

以上是关于如何用 python 分析网站日志的主要内容,如果未能解决你的问题,请参考以下文章

#IT明星不是梦#利用Python进行网站日志分析

awk日志分析

python简单日志分析

大数据入门第一课 Hadoop基础知识与电商网站日志数据分析

如何用最简单的Python爬虫采集整个网站

Python开发程序:生成环境下统计网站访问日志信息