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())))


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM