python解析日志,获取想要的数据

由于老大需要对日志进行解析,获取到相应桩的信息,所以我写了个专门的解析脚本,就是执行的时间有点长,如果用java的话应该可以快2/3.练一下python.

  1. 在该脚本中遇到的问题就是des解密的时候有一个固定8位的key.当时使用32位的长key,每次都报错,后来发现可以先使用8位空key设置,再setKey(KEY)为32位的.
  2. 解析截取到的数据时,看似json格式,其实并不是,所以单写了个解析方法.
# -*- coding: utf-8 -*-
import os
import linecache	# 对文件进行行缓存,可以直接取到想要的行值
import base64		# base64解码
import pandas as pd	# 进行格式化数据
from pyDes import *
from Crypto import Random
import sys
from urllib import parse	# 进行urlencode
import time				# 记录时间
import json				# json转化	

FILEDIR = r'E:\aaa'
KEY = '' # 秘钥 
PILENUMBERS = ['1011895210701234176-1',
               '1011895210701234176-2',
               '1011895284617453568-1',
               '1011895284617453568-2',
               '1011895333984407552-1',
               '1011895333984407552-2',
               '1011895376523038720-1',
               '1011895376523038720-2',
               '1011895424895950848-1',
               '1011895424895950848-2']


def read_file(filelist):
    time = []
    cipherText = []
    plainText = []
    for filename in filelist:
        filename = FILEDIR + '\\' + filename
        if os.path.exists(filename):
            cache_data = linecache.getlines(filename)
            for line in range(len(cache_data)):
                if r'DES》》Base64后' in cache_data[line]:
                    str = cache_data[line][len('>DES》》Base64后>'):]
                    plain = des_decrypt(str)
                    s2 = analysis(plain)['pileNumber']
                    if s2 in PILENUMBERS:
                        time.append(cache_data[line + 3][0:len('2019-03-12 20:13:04')])
                        cipherText.append(str)
                        plainText.append(plain)
    dataframe = pd.DataFrame({'时间': time, '密文': cipherText, '明文': plainText})
    dataframe.to_csv(FILEDIR + '\\' + 'wx.csv', index=False, sep=',', encoding='gbk')


# 获取文件夹下所有的文件
def file_name(filedir):
    filelist = os.listdir(filedir)
    return filelist


# des解密
def des_decrypt(str):
    cipherX = des(key='        ', IV=Random.new().read(8), pad=None, padmode=PAD_PKCS5)
    cipherX.setKey(KEY)
    b = cipherX.decrypt(base64.b64decode(str))
    return parse.unquote(bytes.decode(b)).replace('+', '')


# 解析{uid='61916',terminal='web',id='61916',pileNumber='1011895424895950848-2'}
yuan = r"{uid='61916',terminal='web',id='61916',pileNumber='1011895424895950848-2'}"


def analysis(str):
    new_str = '{'
    d = str.replace('=', ':')
    for i in range(len(d.split(','))):
        if '{' in d.split(',')[i].split(':')[0]:
            key = "'" + d.split(',')[i].split(':')[0].replace('{', '') + "'"
        else:
            key = "'" + d.split(',')[i].split(':')[0] + "'"
        if '}' in d.split(',')[i].split(':')[1]:
            value = d.split(',')[i].split(':')[1].replace('}', '')
        else:
            value = d.split(',')[i].split(':')[1]

        f = key + ':' + value
        if 0 < i < len(d.split(',')):
            new_str = new_str + ',' + f
        elif i == 0:
            new_str = new_str + f
    return json.loads((new_str + '}').replace("'", '"'))



# print(analysis(yuan)['pileNumber'])

if __name__ == '__main__':
    print('开始时间:', time.strftime('%Y.%m.%d %H:%M:%S', time.localtime(time.time())))
    read_file(file_name(FILEDIR))
    print('结束时间:', time.strftime('%Y.%m.%d %H:%M:%S', time.localtime(time.time())))

posted @ 2019-04-30 15:34  lisongyu  阅读(3903)  评论(0编辑  收藏  举报