#! /usr/local/bin/python import re import os import gzip SHOW_LOG = True GZ_FILE_PATH = '' def init(): global SHOW_LOG SHOW_LOG = True global GZ_FILE_PATH #the input file GZ_FILE_PATH = '/data/logs/access.log.1.gz' def main(): #init global variables init() #gzip file #read the existing gzip-format file if os.path.exists(GZ_FILE_PATH): pf = gzip.open(GZ_FILE_PATH, 'r') #match regular expression pattern = re.compile(r'^.*\[(.*) \+0800\].*uid=(\d+).*"(Mozilla.*)" ".*" "(\d+\.\d+\.\d+\.\d)') '''read file, match filter and save into new file''' try: #output file fw = open(r'/data/logs/nginx/result.log','w') try: for line in pf: match = pattern.match(line) if match: for n in range(1,5): fw.writelines(match.group(n)+' ') print(match.group(n)+' ') print('\n') fw.writelines('\n') except ValueError: pass except IOError as err: print('File Error:'+str(err)) finally: #f.close() fw.close() if __name__ == '__main__': main()
代码很短,没有多少行,从开头到结尾,算上注释乱七八糟不过45行。
但是刚开始写,各种都要查,所以写的很慢。
一开始的时候,只是实现了从一个文件读取数据,然后用正则过滤后存储到另一个文件的功能。
拿去给运维的大哥部署,因为套路不熟,我连测试都没测,就给人家了,结果必然是错误百出。
被组长训了一顿。拿回来重写。
后来写了,我要进行测试,准备上传到服务器上,结果没有服务器的传输权限,只能在我能登陆的服务器上进行测试。数据也是截取了一小段数据。结果是各种问题,上网查了,发现是python的版本不对,我查看了服务器的版本,是2.6,而我本机上用的是3.0,没办法,我又重新下了2.6版本的python,重新编译程序。果然有好多错误,上网查了,修改了,弄到没有错误了。
但是后来需求又告诉我需要读取的是压缩后的文件,要先解压才能行。我准备用shell解压,结果发现没有权限,shit。只好把解压的过程写在程序里。写完之后又有问题了,拿来原数据进行实测,发现原数据太大了,解压不了,很快内存就被占满溢出了。
幸好python提供了强大的gzip包,能够在读取了压缩文件头之后按行进行解压,不会占用太多的内存。然后又添加了一些我不太了解的异常处理,都是从别人那拿来的,具体的意思我还不是很了解,还得多多学习啊!