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,需要自行设定环境变量

执行效果

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

exe

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

总结

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容