手写python 处理宝塔面板网站日志的轮子

最近因为接了客户的一个需求,将宝塔面板的数据通过调用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,垃圾算法,实在不知道如何描述自己写的这个东西,可能说是轮子都够呛,欢迎大佬指点

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注