博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
py正则分析日志 自己用的
阅读量:6084 次
发布时间:2019-06-20

本文共 11783 字,大约阅读时间需要 39 分钟。

hot3.png

日后在做整理

#!/usr/bin/env python# -*- coding: utf-8 -*-# Created by weilai on 2016/12/21# 自动分析火车票发送和接受日志工具,wl 201611221# 用于分析火车票发送和收通知的内容 和时差# v0.1import osimport datetimeimport timeimport jsonimport re# 定义基础目录path = 'X:\\AccDetail'send_log_base_path = 'X:\\InteractionDetail'receive_log_base_path = 'X:\\InteractionDetail'now = datetime.datetime.now()today_dir = '20161221' #now.strftime('%Y%m%d')# 定义基础目录和时间目录组合work_dir = path + '\\' + today_dirsend_log_path = send_log_base_path + '\\' + today_dirreceive_log_path = receive_log_base_path + '\\' + today_dir# 定义发送,接收,结果集合book_list = []receive_list = []ticket_list = []pattern_log_body = r'\[BEGIN\]([\s\S.]*?)\[END\]'pattern_log_time = r'\[L_B\]时间戳:(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3})\[L_E\]'pattern_log_run_time = r'\[L_B\]时间间隔:(\d{7}\.\d{3})\[L_E\]'pattern_log_func_name = r'\[L_B\](自定义消息:book)\[L_E\]'pattern_log_send_content = r'\[L_B\]发送内容:j=([\s\S.]*?)\[L_E\]'pattern_log_receive_content = r'\[L_B\]接收内容:([\s\S.]*?)\[L_E\]'pattern_log_notice_func_name = r'\[L_B\](自定义消息:预定结果通知)\[L_E\]'pattern_log_notice_send_content = r'\[L_B\]发送内容:([\s\S.]*?)\[L_E\]'pattern_log_notice_receive_content = r'\[L_B\]接收内容:j=([\s\S.]*?)\[L_E\]'class InteractiveInfo:    """初级分析结果类"""    log_time = ''    log_name = ''    log_run_time = ''    log_param = ''    log_result = ''    flow_id = ''    order_id = ''    out_order_id = ''    msg = ''    log_file = ''    valid_data = False    train = ''    passager = ''    ticket = ''class TicketInfo:    """最后分析结果类"""    ticket_order_id = ''    ticket_out_order_id = ''    ticket_flow_id = ''    ticket_send_time = ''    ticket_receive_time = ''    time_diff = 0    receive_times = 0    info_from_file = ''    msg = ''    source_send_data = None    source_receive_data = None# ------------------------------------------------def regex_text(pattern_str, txt):    pattern = re.compile(pattern_str, re.M)    match = pattern.findall(txt)    if match:        return match    return Nonedef regex_log_body(txt):    return regex_text(pattern_log_body, txt)def regex_log_time(txt):    return regex_text(pattern_log_time, txt)def regex_log_run_time(txt):    return regex_text(pattern_log_run_time, txt)def regex_log_func_name(txt):    return regex_text(pattern_log_func_name, txt)def regex_log_send_content(txt):    return regex_text(pattern_log_send_content, txt)def regex_log_receive_content(txt):    return regex_text(pattern_log_receive_content, txt)def regex_log_notice_func_name(txt):    return regex_text(pattern_log_notice_func_name, txt)def regex_log_notice_receive_content(txt):    return regex_text(pattern_log_notice_receive_content, txt)# ----------------------------------------------def analyse_send_file(log_file_path):    with open(log_file_path, 'r', encoding='utf-8') as f:        print(log_file_path)        log_file_str = f.read()        logs = regex_log_body(log_file_str)        for log in logs:            log_item = log            log_name = regex_log_func_name(log_item)            if log_name is not None:                send_log = InteractiveInfo()                send_log.log_name = log_name[0]                send_log.log_file = log_file_path                # print(log_name[0])                log_time = regex_log_time(log_item)                send_log.log_time = log_time[0]                # print(log_time[0])                log_run_time = regex_log_run_time(log_item)                send_log.log_run_time = log_run_time[0]                # print(log_run_time[0])                send_content = regex_log_send_content(log_item)                get_send_json(send_content[0], send_log)                # print(send_content[0])                receive_content = regex_log_receive_content(log_item)                get_send_result_json(receive_content[0], send_log)                # print(receive_content[0])                book_list.append(send_log)# ---------------------------------------------------def get_send_result_json(json_str, send_obj):    json_val = json.loads(json_str)    send_obj.flow_id = str(json_val['i'])    send_obj.msg += json_val['m'] + "|"def get_send_json(json_str, send_obj):    json_val = json.loads(json_str)    send_obj.order_id = json_val['d']['n']    x1 = lambda x: x['pn']    send_obj.passager = ','.join([x1(y) for y in json_val['d']['p']])    send_obj.train = '{0}|{1}|{2}|{3}'.format(json_val['d']['c'], json_val['d']['d'], json_val['d']['fn'], json_val['d']['tn'])    # print(send_obj.train)# -----------------------------------------------def analyse_receive_file(log_file_path):    with open(log_file_path, 'r', encoding='utf-8') as f:        print(log_file_path)        log_file_str = f.read()        logs = regex_log_body(log_file_str)        for log in logs:            log_item = log            log_name = regex_log_notice_func_name(log_item)            if log_name is not None:                receive_log = InteractiveInfo()                receive_log.log_name = log_name[0]                # print(receive_log.log_name)                receive_log.log_file = log_file_path                # print(log_name[0])                log_time = regex_log_time(log_item)                receive_log.log_time = log_time[0]                # print(log_time[0])                log_run_time = regex_log_run_time(log_item)                receive_log.log_run_time = log_run_time[0]                # print(log_run_time[0])                # 无需这两句 不分解发送内容                # send_content = regex_log_send_content(log_item)                # get_receive_json(send_content[0], receive_log)                # print(send_content[0])                receive_content = regex_log_notice_receive_content(log_item)                get_receive_result_json(receive_content[0], receive_log)                # print(receive_content[0])                receive_list.append(receive_log)def get_receive_result_json(json_str, receive_obj):    json_val = json.loads(json_str)    receive_obj.flow_id = str(json_val['i'])    receive_obj.out_order_id = str(json_val['d']['i'])    receive_obj.order_id = str(json_val['d']['n'])    receive_obj.msg += json_val['m'] + "|"    x1 = lambda x: x['tn']+'|'+x['si']+'|'+x['pr']    if 't' in json_val['d']:        receive_obj.ticket = json_val['d']['t'] + '|'    if 'p' in json_val['d']:        receive_obj.ticket = ','.join([x1(y) for y in json_val['d']['p']])    receive_obj.ticket.replace('\n', '')    # print(receive_obj.ticket)def get_receive_json(json_str, send_obj):    pass    # -----------------------------------------------# -----------------------------------------------def analyse_file(analyse_dir, dir_str, analyse_func):    """分析日志"""    file_list = os.listdir(analyse_dir)    for dir_name in file_list:        if dir_name.find(dir_str) >= 0:            full_path = analyse_dir + '\\' + dir_name            # print(full_path)            files = os.listdir(full_path)            for file in files:                file_path = full_path + '\\' + file                analyse_func(file_path)# ----------------------------------------------def analyse_send_log(analyse_dir):    analyse_file(analyse_dir, '火车票交互服务', analyse_send_file)def analyse_receive_log(analyse_dir):    analyse_file(analyse_dir, '火车票业务收通知网站基线', analyse_receive_file)def show_send_list(source_list):    """显示分析的发送日志"""    global book_list    book_list = sorted(source_list, key=lambda x: x.log_time)    i = 0    p_template = '{0})=={1}=={2}=={3}=={4}=={5};'    for item in book_list:        i += 1        p_str = p_template.format(str(i), item.log_time, item.log_name, item.flow_id, item.order_id, item.msg)        print(p_str)def show_receive_list(source_list):    """显示分析的接收日志"""    global receive_list    receive_list = sorted(source_list, key=lambda x: x.log_time)    i = 0    p_template = '{0})=={1}=={2}=={3}=={4}=={5};'    for item in receive_list:        i += 1        m = item.msg        if item.msg == '|':            m += item.ticket        p_str = p_template.format(str(i), item.log_time, item.log_name, item.flow_id, item.order_id, m)        print(p_str)# ----------------------------------------------def analyse_diff(send_list, result_list):    """对比发送数据和接收数据,组合对照数据,并计算运行时差"""    for b_item in send_list:        for r_item in result_list:            if b_item.flow_id == r_item.flow_id and b_item.flow_id != '': # 不能为空字符串                has_it = [x for x in ticket_list if x.ticket_flow_id == b_item.flow_id]                if len(has_it) <= 0:                    t = TicketInfo()                    t.ticket_send_time = b_item.log_time                    t.ticket_receive_time = r_item.log_time                    t.ticket_flow_id = b_item.flow_id                    t.ticket_order_id = b_item.order_id                    t.ticket_out_order_id = r_item.out_order_id                    t.msg = b_item.msg + '|' + r_item.msg                    t.receive_times = 1                    t.time_diff = 0                    t.info_from_file = '{f1}|{f2}'.format(f1=b_item.log_file, f2=r_item.log_file)                    time_a1 = time.strptime(t.ticket_receive_time, "%Y-%m-%d %H:%M:%S.%f")                    time_stamp1 = datetime.datetime(*time_a1[:6])                    time_a2 = time.strptime(t.ticket_send_time, "%Y-%m-%d %H:%M:%S.%f")                    time_stamp2 = datetime.datetime(*time_a2[:6])                    t.time_diff = (time_stamp1 - time_stamp2).total_seconds()                    # print(t.time_diff)                    ticket_list.append(t)                else:                    has_it[0].receive_times += 1# -------------------------------------------------def show_result_list(source_list):    """显示分析组合结果"""    global ticket_list    ticket_list = sorted(source_list, key=lambda x: x.ticket_send_time)    i = 0    p_template = '{0})={1}=={2}=={3}-{4}[{5}秒]{6}次'    for item in ticket_list:        i += 1        p_str = p_template.format(str(i), item.ticket_flow_id, item.ticket_order_id, item.ticket_send_time,                                  item.ticket_receive_time, str(item.time_diff), str(item.receive_times), item.info_from_file)        print(p_str)# ---------------------------------------------------print('/***********火车票发送交互服务日志[{0}]***********/'.format(today_dir))analyse_send_log(send_log_path)show_send_list(book_list)print('/***********火车票接收通知日志[{0}]***********/'.format(today_dir))analyse_receive_log(receive_log_path)show_receive_list(receive_list)print('/***********火车票占座时差计算[{0}]***********/'.format(today_dir))analyse_diff(book_list, receive_list)show_result_list(ticket_list)# 样品xx = """[BEGIN][L_B]日志ID:bb1f4d67-162f-47d0-90b0-c27bfbe218cb[L_E][L_B]时间点:636179106143493242[L_E][L_B]跟踪ID:00517WCF16122109492672990[L_E][L_B]时间戳:2016-12-21 09:50:14.349[L_E][L_B]时间间隔:0047620.052[L_E][L_B]应用程序名:火车票交互服务v0029[L_E][L_B]模块名:火车票交互[L_E][L_B]方法名:[L_E][L_B]方法说明:[L_E][L_B]进程ID:25968[L_E][L_B]线程ID:27[L_E][L_B]发送地址:http://121.41.85.136/a.ashx[L_E][L_B]异常ID:[L_E][L_B]异常级别:[L_E][L_B]自定义消息:book[L_E][L_B]交互类型:[L_E][L_B]关键信息1:1612210950140910f0500236688[L_E][L_B]关键信息2:[L_E][L_B]机器名:WIN-VDHFP5GHJ89[L_E][L_B]本地IP:172.17.1.242[L_E][L_B]发送内容:j={"a": true,"b":[{"PassagerID":1,"TicketKeyID":"1688"}],"c": "s55666","d": {  "c":"D2244","d":"2016-12-31","n":"161221095016770236688","w":false,"p":[{"pi":"555555555555555554","pn":"某","po":1,"ic":"1","xc":"O","pc":"1"}],"fc":"ICW","fn":"成都东","tc":"NIW","tn":"遂宁"    },     "f": "book",     "r":"http://9999.com:1401/Notify",   "s": "c722f24f1ec88271a3c0aed7e70f6835",            "t": "20161221095014",        "w": 30000 }[L_E][L_B]接收内容:{  "c": 0,  "d": null,  "m": "请等待异步",  "s": true,  "w": true,  "i": 2016122100000000298}[L_E][L_B]路由:r+zYFqAUxzhIEINyz9RyMppo9SMJ1oVwbqlQwyzn0Wol+lxGUB1MwjcWz88Pa5ah7StDIUP/0XBirsjsZMiW0BfC8lHJzAILcpwLva4Q8/zrzra0mjlKFg@@[L_E][END]"""y = re.findall(r'\[BEGIN\]([\s\S.]*?)\[END\]', xx, re.M)print(y)

 

 

转载于:https://my.oschina.net/raddleoj/blog/811141

你可能感兴趣的文章
Internet Message Access Protocol --- IMAP协议
查看>>
Linux 获取文件夹下的所有文件
查看>>
对 Sea.js 进行配置(一) seajs.config
查看>>
第六周
查看>>
解释一下 P/NP/NP-Complete/NP-Hard 等问题
查看>>
javafx for android or ios ?
查看>>
微软职位内部推荐-Senior Software Engineer II-Sharepoint
查看>>
sql 字符串操作
查看>>
【转】Android布局优化之ViewStub
查看>>
网络安全管理技术作业-SNMP实验报告
查看>>
根据Uri获取文件的绝对路径
查看>>
Flutter 插件开发:以微信SDK为例
查看>>
.NET[C#]中NullReferenceException(未将对象引用到实例)是什么问题?如何修复处理?...
查看>>
边缘控制平面Ambassador全解读
查看>>
Windows Phone 7 利用计时器DispatcherTimer创建时钟
查看>>
程序员最喜爱的12个Android应用开发框架二(转)
查看>>
vim学习与理解
查看>>
DIRECTSHOW在VS2005中PVOID64问题和配置问题
查看>>
MapReduce的模式,算法以及用例
查看>>
《Advanced Linux Programming》读书笔记(1)
查看>>