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