log文件过滤程序(python)

背景

最近课长时不时让我统计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,需要自行设定环境变量

执行效果

log文件过滤程序(python)_第1张图片
log文件过滤程序(python)_第2张图片
log文件过滤程序(python)_第3张图片

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

exe

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

总结

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

你可能感兴趣的:(log文件过滤程序(python))