#! /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包,能够在读取了压缩文件头之后按行进行解压,不会占用太多的内存。然后又添加了一些我不太了解的异常处理,都是从别人那拿来的,具体的意思我还不是很了解,还得多多学习啊!
转载于:https://blog.51cto.com/gomic/1405034