zoukankan      html  css  js  c++  java
  • python监控linux某个端口的消息报文往来

    1、修改如下listen.py文件中的监听端口号,例如监控8089端口

    2、将该文件上传到待监控的linux服务器某个路径下

    3、执行python listen.py启动该监控应用

    4、在任一服务器发送请求到该监控服务器的端口上,通过打印的日志可以查看到消息往来

    5、可以打印出请求报文的类型、长度等相关内容数据以及响应报文

    listen.py文件内容为:

    #! /usr/bin/env python
    # -*- coding: utf-8 -*- 
    
    from wsgiref.simple_server import make_server
    from cgi import parse_qs,escape
    import datetime,os,logging,re,chardet
    from logging.handlers import TimedRotatingFileHandler
    
    #全局变量
    tree_result_list={}
    xml_sub_list=[]
    
    def console_log_out(logFilename):
        ''''' Output log to file '''
        # 初始化并定义级别
        logger = logging.getLogger()  # 初始化
        logger.setLevel(logging.INFO)  # 指明了将会分发日志的最低级别
        
        #TimedRotatingFileHandler()按照时间自动分割日志文件 
        fh=TimedRotatingFileHandler(logFilename,when='D',interval=1,backupCount=3)
        fh.suffix="%Y%m%d.log"
        #Formatter对象设置日志信息最后的规则、结构和内容
        formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
        fh.setFormatter(formatter)#该处理器选择一个格式化器
        logger.addHandler(fh)# 把对象加到logger里
        
        cs=logging.StreamHandler()#往屏幕上输出
        cs.setFormatter(formatter)#设置屏幕上显示的格式
        logger.addHandler(cs)# 把对象加到logger里
        
    def application(environ,start_response):
        #功能说明:服务端应用程序,实现实时获取充值请求报文数据并保存至文件,返回请求响应报文并保存至文件中
        #by xiaocc[2018-7-5]
            
        #CONTENT_LENGTH 可能为空,或者没有
        #客户端请求信息放到环境变量environ中
        envdate = [
            '%s: %s' % (key, value) for key, value in sorted(environ.items())
        ]
        envdate = '
    '.join(envdate)  # 由于下面将Content-Type设置为text/plain,所以`
    `在浏览器中会起到换行的作用
        print '-------------------start-------------------'
        print 'environment item values: 
    ',envdate
        print '-------------------end-------------------' 
        print 'environment CONTENT-LENGTH is : ',environ.get('CONTENT_LENGTH')
        try:
            request_body_size=int(environ.get('CONTENT_LENGTH',0))
            logging.info('notifyrequest_body_size: %s' % request_body_size)
        except(ValueError):
            request_body_size=0
            logging.error('notifyrequest_body_size: %s' % request_body_size)
        
        #通过 wsgi.input获取请求数据 
        request_body=environ['wsgi.input'].read(request_body_size)
    
        logging.info(request_body)
    #     logging.info( u'原始请求报文:%s' % request_body)
        d=parse_qs(request_body)
        logging.info( '处理后的请求报文 : %s' % d)
    
        #生成通知请求响应报文,报文模板文件名格式为"ActivityCode.xml"
        response_body='no response'        
        
        status='200 OK'
        
        response_headers=[
            ('Content-Type','text/xml'),
            ('Content-Length',str(len(response_body)))
            ]
        
        start_response(status, response_headers)
        logging.info('成功发送通知请求响应报文到客户端')
        return [response_body]
    
    console_log_out('log.txt')
    httpd=make_server('', 8089, application) #可以根据需监听的端口修改
    logging.info('serving HTTP on port 8089.....')
     
    httpd.serve_forever()
  • 相关阅读:
    [小技巧] micropython 如何执行 *.mpy 文件
    从零开始深入 Linux 底层(软件工程)
    从嵌套结构中取值时如何编写兜底逻辑
    学习JUC源码(2)——自定义同步组件
    学习JUC源码(1)——AQS同步队列(源码分析结合图文理解)
    Java多线程中的wait/notify通信模式
    详解Java锁的升级与对比(1)——锁的分类与细节(结合部分源码)
    认识Redis集群——Redis Cluster
    工作三年多的感慨与总结(二)
    工作三年多的感慨与总结(一)
  • 原文地址:https://www.cnblogs.com/apple2016/p/14595683.html
Copyright © 2011-2022 走看看