美文网首页python自学
log文件过滤程序(python)

log文件过滤程序(python)

作者: 今後次 | 来源:发表于2017-06-13 17:33 被阅读679次

    背景

    最近课长时不时让我统计CDN服务器上某个zip的下载次数。
    确认了一下访问log。30天的log大概700多个文件,90万行,140M左右。从里面过滤出必须的几百条。

    本来最简单的办法是使用Talend,但是打开去年安装的Talend发现软件已经更新N版,且我本地的java版本变换过几次,导致不兼容。重新下载和安装费时费力。于是放弃了。

    第一次统计采用最原始的execl和txt文本处理,倒也是能对付的了。
    只是90万行,execl处理起来基本每一步骤都是死机状态。

    最后决定自己用新学的python写几行代码实现。

    程序构造

    • 读取log文件
    • 判断有没有关键字
    • 有的话输入到output.txt中

    提前准备

    首先把700多个log文件合并到一起。

    合并工具

    在txt文本中写一行命令

    type *.txt > input.txt

    保存为hebing.bat

    双击bat

    把hebing.bat拷贝到存放700多个log的文件夹下,双击执行。这样就生成了input.txt
    是不是很简单?!

    log过滤程序初版

    把input.txt剪切到mapDownload.py所在的文件夹。
    mapDownload.py内容如下

    #-*- coding:UTF-8 -*-
    #读取一个文件的每一行,每一行为一个字符串
    #判断字符串中是否包含【XXXXXX.zip】关键字
    #包含的话,就输出这一行到别的文件中
    #mapDownload.py 和 input.txt output.txt 放在一个文件夹下执行py文件
    import sys
    import math
    #打开文件
    try:
        file_object=open('input.txt',"r+")
    except IOError:
        print ("No Found File!")
    else:
        file_result=open('output.txt',"w+")
    #判断是否包含XXXXXX.zip
        def IncludeOverall(str):
            if str.find('XXXXXX.zip')<0:
                return False
            else:
                return True
    #读取文件
        print("。。。")
        for line in file_object:
            line = line.strip()
            if IncludeOverall(line):
                file_result.write(line+"\n")
            else:
                continue
        file_object.close()
        file_result.close()
        print("完成") 
    

    执行

    双击mapDownload.py之后查看output.txt
    ※python版本3.6,需要自行设定环境变量

    执行了效果

    90万行抽取出570行,用时大概2,3秒

    进化版

    初版中input和output文件是写死在代码中,现在做一版有UI的,可以选择任意路径文件和输入过滤任意关键字。

    程序代码

    main.py

    import os
    from filter import mains
    from tkinter import *
    from tkinter.filedialog import askopenfilename
    
    def exists_mkdir():
        if os.path.exists('D:\output.txt'):
            pass
        else:
            os.mknod('D:\output.txt')
    
    def logdo():
        c["text"] = "开始。。。"
        try:
            s1 = pathObj.get()
            s2 = keyword.get()
            if s1.strip()=='' or s2.strip()=='':
                c["text"] = "请选择文件并输入关键字!"
            elif not os.path.exists(s1):
                c["text"] = "请正确选择文件!"
            else:
                if mains(s1,s2) :
                    c["text"] = "运行成功"
                else:
                    c["text"] = "好像哪里出错了"
        except Exception:
            c["text"] = "好像哪里出错了"
    
    def selectPath():
        path_ = askopenfilename()
        logpath.set(path_)
    
    #创建程序运行需要的工作目录
    exists_mkdir()
    
    tk = Tk()
    # 设置字体
    tk.option_add("*Font", "宋体")
    # 设置窗口大小和位置
    tk.geometry('430x350+80+60')
    
    # 不允许改变窗口大小
    tk.resizable(False, False)
    
    ## 用来显示Label组件
    tk.title('log过滤')
    w1 = Label(tk,text='欢迎使用')
    w2 = Label(tk,text='步骤1:选择需要过滤的文件')
    w3 = Label(tk,text='步骤2:输入需要过滤的关键字')
    w4 = Label(tk,text='步骤3:点击执行按钮直到结束')
    
    w1.grid(row=1,column=0,sticky=W)
    w2.grid(row=2,column=0,sticky=W)
    w3.grid(row=3,column=0,sticky=W)
    w4.grid(row=4,column=0,sticky=W)
    
    logpath = StringVar()
    Label(tk,text = "*目标路径:").grid(row = 9, column = 0,sticky=W)
    pathObj = Entry(tk, textvariable = logpath)
    pathObj.grid(row = 10, column = 0,columnspan=2,sticky=W)
    Button(tk, text = "路径选择", command = selectPath).grid(row = 10, column = 2,sticky=E)
    
    ## 用来显示输入框
    lWord = Label(tk,text="*输入关键字:")
    lWord.grid(row=11,column=0,sticky=W)
    keyword = Entry(tk)
    keyword.grid(row=12,column=0,sticky=W)
    
    ## 用来显示Button
    b = Button(tk,text='执行抽取',command=logdo)
    b.grid(row=18,column=0,sticky=E,columnspan=3,rows=3)
    
    c = Label(tk,text="",background="yellow")
    c.grid(row = 22,column=0,sticky=W)
    
    # 启动消息主循环
    tk.mainloop()
    

    filter.py

    #-*- coding:UTF-8 -*-
    #读取一个文件的每一行,每一行为一个字符串
    #判断字符串中是否包含关键字
    #包含的话,就输出这一行到别的文件中
    import sys
    import math
    
    def mains(path,keyword):
        try:
            #打开文件
            file_object=open(path,"r+")
        except IOError:
            print ("No Found File!")
            return False
        else:
            file_result=open('D:\output.txt',"w+")
            #判断是否包含关键字
            def IncludeOverall(str):
                if str.find(keyword)<0:
                    return False
                else:
                    return True
            #读取文件
            print("开始抽取")
            for line in file_object:
                line = line.strip()
                #print(line)
                if IncludeOverall(line):
                    file_result.write(line+"\n")
                else:
                    continue
            file_object.close()
            file_result.close()
            print("抽取结束")
            return True
    

    执行

    双击main.py
    ※python版本3.6,需要自行设定环境变量

    执行效果

    然后在D盘自动生成结果文件output.txt。

    exe

    尝试打包成exe,一直不成功。先留坑吧,作为以后课题。

    总结

    python简单上手快,资源比较多。有一定编程基础可以很快上手,借助google先生可以很快做出一些小工具。

    相关文章

      网友评论

        本文标题:log文件过滤程序(python)

        本文链接:https://www.haomeiwen.com/subject/osttqxtx.html