楼主最近刚刚接触python,还是个小菜鸟,没有学习python之前可以说楼主的shell已经算是可以了,但用shell很多东西实现起来还是不可能的事情,例如最明显的一点大日志分析,由于楼主的公司,每天的日志量很大,用shell分析的会非常非常的慢。
通过学习python,楼主有了一种想法,想法如下
可不可以分割日志,把日志分割成很多的小块,利用多线程去分析日志,这个难点在哪,难点就在如何去分割日志,前几篇文件楼主写过日志分割的python版,但是存在很大的弊端,只能够针对小日志进行分割,因为上一篇是把日志先写到列表中,大家都知道列表时要站内存的,那如果说日志很大,岂不一下就把内存吃满了。废话就不多说了,楼主来阐明下如何解决此问题
首先创建一个文本,文本内容如下
1 2 3 . . . 1000
1.计算出文本一行的大小比如说是4B
2.用服务器的总内存数除以4B 计算出我的服务器可以一次性分析多大的文件,这个数就是我一个文本应该为多少行,也就是说我切割的日志,一个文件是多少行
下面奉献出日志切割的脚本
#!/usr/bin/python from time import ctime def splitFile(fileLocation, targetFoler): file_handler = open(fileLocation, 'r') block_size = 100 (为我每个文件的行数) line = file_handler.readline() temp = [] countFile = 1 while line: for i in range(block_size): if i == (block_size-1): # write block to small files file_writer = open(targetFoler + "file_"+str(countFile)+".txt", 'a+') file_writer.writelines(temp) file_writer.close() temp = [] print " file " + str(countFile) + " generated at: " + str(ctime()) countFile = countFile + 1 else: temp.append(file_handler.readline()) if countFile == 11: break; file_handler.close() if __name__ == '__main__': print "Start At: " + str(ctime()) splitFile("/home/python/test.txt", "/tmp/")
分割完日志后,下面就该进行日志分析了
#!/usr/bin/python import os import re import threading def chaFile(path): a=os.listdir(path) for i in range(len(a)): b=a[i] c=open("/home/python/rizhifenge.txt","a+") kk="n"+b c.writelines(kk) c.close() d=open("/home/python/rizhifenge.txt","r") f=d.read() e=re.findall("file.*",f) return e d.close() def chaZhao(path): aa=open(path,"r+") bb=aa.read() cc=re.search("d.",bb) if cc: print cc.group() aa.close() if __name__ == "__main__": ff="/tmp/" for i in chaFile(ff): gg=ff+i a=threading.Thread(target=chaZhao,args=(gg,)) a.start()
转载请注明:爱开源 » python 多线程日志切割+日志分析