最近因为接了客户的一个需求,将宝塔面板的数据通过调用API的形式显示到新的前端界面去
而且不受到宝塔面板是否是专业版本的限制,也就是说,为了能够正确的获得面板中的数据,emm,我必须写一个辅助插件
几经挫折,很快这个插件就初具雏形了,但是其中有一个非常讨厌恶心的问题,如何获得客户服务器上的网站日志数据
我仔细研究了宝塔的网站监控报表插件,结果发现,tmd,这个插件是通过在nginx / apache 下面安装 lua 拓展,实时保存了网站的访问数据
MMP,我可没有时间去写,也没能力去写 lua 拓展(虽然实验室有个大佬懂得使用lua 写外挂,但是这是两码事),于是乎,只能自己手写一个python 轮子,并且放到后台挂起
每间隔一段时间自动处理一下日志数据,在开发用的2H4G 服务器上,这个轮子完美运行。但是不知道到了正式环境,几百兆甚至几G的日志文件时,这个轮子会作何反应
#!/usr/bin/python
# coding: utf-8
import sys, os, json
import time
# 设置运行目录
os.chdir("/www/server/panel")
# 添加包引用位置并引用公共包
sys.path.append("class/")
import public
class website_manager:
WebSite = []
logpath = "/www/wwwlogs/"
tmpjsonpath = "/www/server/panel/plugin/btpanel/tempjson/"
WebServer = ""
# 构造方法
def __init__(self):
self.GetPanelServerType()
if not os.path.exists(self.tmpjsonpath):
os.mkdir(self.tmpjsonpath)
self.GetPanelServerType()
self.GetSiteListByDB()
# 取面板的web 服务器的类型
def GetPanelServerType(self):
data = public.M('config').where("id=?", ('1',)).field('webserver').find();
self.WebServer = data['webserver']
# 取面板数据库中所有站点的信息
def GetSiteListByDB(self):
data = public.M('sites').field('name').select();
self.WebSite = data
# 按照今天的日期切割nginx/apache 的日志
def WriteTmpJson(self):
#爬虫设定
spiders = {"baidu": [], "360": [], "bing": [], "google": []}
spiders["baidu"] = ["Baiduspider-image", "Baiduspider-video", "Baiduspider-news", "Baiduspider-favo",
"Baiduspider-cpro", "Baiduspider-mobile", "Baiduspider"]
spiders["360"] = ["360Spider"]
spiders["bing"] = ["bingbot"]
spiders["google"] = ["Googlebot-Image", "Googlebot", "AdsBot-Google-Mobile"]
spidername = ["baidu", "360", "bing", "google"]
# 获得今天的日期
# 日志文件中的日期 [04/Jul/2019:08:20:03 +0800]
StrToday = time.strftime("%d/%b/%Y", time.localtime())
for site in self.WebSite:
spider = {"baidu": 0, "360": 0, "bing": 0, "google": 0}
PV = UV = IP = 0
IPList = []
IPDict = {}
# 根据当前WEB 服务器的不同尝试获得不同的log 文件
if self.WebServer == "nginx": logpath = self.logpath+site["name"]+".log"
else: logpath = self.logpath+site["name"]+"-access_log"
log = public.ReadFile(logpath)
log = log.split("\n")
nlog = ""
cut = False
for line in log:
if line.find(StrToday)!= -1:
cut = True
if cut:
info = line.split(" ")
ip = info[0]
user_agent = ""
lnum = len(info)
num = 11
while num <= lnum - 1:
user_agent = user_agent + info[num]
num = num + 1
# 统计PV 信息
PV = PV + 1
# 统计 搜素引擎爬取情况
for S in spidername:
for s in spiders[S]:
if user_agent.find(s) != -1:
spider[S] = spider[S] + 1
# 统计IP信息
IPStatus = False
for i in IPList:
if ip == i:
IPStatus = True
break
if not IPStatus:
IPList.append(ip)
IP = IP + 1
dict = {ip: []}
IPDict.update(dict)
# 统计UV 信息
UVStatus = False
t = 0
for u in IPDict[ip]:
if u == user_agent:
UVStatus = True
break
if not UVStatus:
IPDict[ip].append(user_agent)
UV = UV + 1
result = {"PV": PV, "IP": IP, "UV": UV, "spider": spider}
public.WriteFile(self.tmpjsonpath+site["name"]+".json",json.dumps(result))
while(1):
starttime = time.time()
sites = website_manager()
sites.WriteTmpJson()
endtime = time.time()
speed = endtime - starttime
speed = round(speed, 3)
print("处理网站日志数据完成,共花费" + str(speed) + " S")
time.sleep(60)
菜鸟python,垃圾算法,实在不知道如何描述自己写的这个东西,可能说是轮子都够呛,欢迎大佬指点