python基于pexpect库自动获取日志信息


Posted in Python onFebruary 01, 2021

1. 前言

对大部分的人来说,解决 Bug 都是依靠关键字去日志去定位问题!

在调试情况下,我们可以实时在控制台查看日志;但对于部署到服务器上的应用,日志都存放在服务器某个目录下,没法通过本地查看到

这种情况下,就需要我们先登录服务器,然后进入到日志目录文件夹,最后通过日志文件去定位问题;如果涉及到 K8s 容器,可能还需要使用 kubectl 命令进入到服务对应的容器中,进入到日志目录,才能开始定位问题,这一切显得非常繁琐且低效

本篇文章介绍一款 Python 依赖库:pexpect,作为一款命令行自动化工具,它可以帮助我们一键获取日志,快速定位问题!

2. pexpect 介绍

pexpect 是 Python 语言实现的类 Expect 的一种实现,通过产生子应用程序并控制它们,通过期望模式对子应用程序的输出做出相应处理

项目地址:

https://github.com/pexpect/pexpect/tree/5eed1a31a2853a09b7367c59fbd1a4a0b53341df

它主要对人机对话进行模拟,来实现一些自动化的场景

比如:用来和 SSH、FTP、PASSWD、Telnet 等命令行程序进行自动化交互

在使用之前,我们先安装依赖包

# 安装依赖库
pip3 install pexpect

3. 实战一下

我们以从服务器 K8S 容器获取日志为例进行讲解

3-1 SSH 登录

首先,初始化使用 pexpect 模拟 SSH 远程登录服务器

import pexpect

PROMPT = ['# ', '>>> ', '> ', '\$ ']

def login_with_pexpect():
    """
    登录-pexpect
    :return:
    """
    # 端口号
    port = **

    # 用户名
    user = **

    # 密码
    pwd = **

    # ip地址
    ip = **

    ssh_cmd = "ssh -p {} {}@{}".format(port,user,ip)

    # 指定登录命令,拿到程序操作句柄
    child = pexpect.spawn(ssh_cmd, timeout=60, encoding='utf-8')

    # 提示输入密码的字符出现,否则超时
    ret = child.expect([pexpect.TIMEOUT, '[P|p]assword: '], timeout=10)

    # 匹配成功后,输入密码,执行登陆操作
    if ret == 1:
        # 发送密码
        child.sendline(pwd)
        child.expect(PROMPT)
        return child
    else:
        print('登录失败!')

其中

pexpect.spawn() :用于执行一个程序,并返回一个操作句柄

该方法常见的 3 个参数如下:

  • 第一个参数是待执行的命令
  • 第二个参数指定超时时间,程序执行后的输出检查,如果指定时间内没有匹配到结果,就会抛异常
  • 第三个参数用于设置编码格式

child.expect() :对输出结果,利用正则表达式进行关键字匹配

代码中的含义是在 10s 内等待出现关键字 '[P|p]assword: '

最后,如果匹配的结果为 1,使用 sendline() 方法发送带回车符的字符串,模拟密码的输入,完成登录操作

3-2  封装发送命令

接下来,我们将操作句柄发送命令进行一次封装,并获取返回结果

def send_command(child, cmd, expected_content=None, timeout=10):
    """
    发送一条命令,并打印结果
    :param expected_content:
    :param child:
    :param cmd:
    :return:
    """
    # 发送一条命令
    if expected_content is None:
        expected_content = ["#"]

    child.sendline(cmd)

    # 期望有命令行提示字符出现
    child.expect(expected_content, timeout=timeout)

    # 将之前的内容都输出
    result = child.before

    return result 

需要指出的是,child.before 用于获取到匹配到关键字为止,缓存里面已有的全部数据

3-3  进入容器 pod 日志目录

使用上面的方法,通过 kubectl 进入到对应的容器日志目录

# 登录pod容器
exec_enter_pod = 'kubectl -n %s exec -it %s  bash' % (env, pod_name)

# 进入容器
send_command(child, exec_enter_pod)

# 进入到日志目录
send_command(child, "cd logs", expected_content='tomcat/logs#')

3-4  获取日志内容

最后我们只需要组成获取日志的命令

比如:使用 grep/tail 命令组成一个提取日志文件的命令

然后使用句柄对象发送这条命令

最后,对返回内容进行清洗即可

4. 最后

文中使用 pexpect 实现了一个非常简单的场景

事实上,大部分人机对话自动化交互都可以由它来实现,比如,下载日志、实时配置、远程打包下载等

以上就是python基于pexpect库自动获取日志信息的详细内容,更多关于python pexpect库自动获取日志的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
跟老齐学Python之有容乃大的list(3)
Sep 15 Python
python实现分析apache和nginx日志文件并输出访客ip列表的方法
Apr 04 Python
Python教程之全局变量用法
Jun 27 Python
pyenv命令管理多个Python版本
Mar 26 Python
python itchat实现微信自动回复的示例代码
Aug 14 Python
详解flask入门模板引擎
Jul 18 Python
python保存字典和读取字典的实例代码
Jul 07 Python
pytorch 在网络中添加可训练参数,修改预训练权重文件的方法
Aug 17 Python
PyCharm汉化安装及永久激活详细教程(靠谱)
Jan 16 Python
python实现五子棋游戏(pygame版)
Jan 19 Python
python用什么编辑器进行项目开发
Jun 17 Python
详解python爬取弹幕与数据分析
Nov 14 Python
Python入门基础之数字字符串与列表
Feb 01 #Python
Pyecharts 中Geo函数常用参数的用法说明
Feb 01 #Python
Python+MySQL随机试卷及答案生成程序的示例代码
Feb 01 #Python
python实现代码审查自动回复消息
Feb 01 #Python
anaconda安装pytorch1.7.1和torchvision0.8.2的方法(亲测可用)
Feb 01 #Python
python 列表推导和生成器表达式的使用
Feb 01 #Python
matplotlib部件之矩形选区(RectangleSelector)的实现
Feb 01 #Python
You might like
PHP中for循环语句的几种变型
2007/03/16 PHP
PHP自动选择 连接本地还是远程数据库
2010/12/02 PHP
基于jQuery的日期选择控件
2009/10/27 Javascript
Jquery Ajax学习实例4 向WebService发出请求,返回实体对象的异步调用
2010/03/16 Javascript
JS 事件绑定函数代码
2010/04/28 Javascript
推荐10个超棒的jQuery工具提示插件
2011/10/11 Javascript
Jquery插件写法笔记整理
2012/09/06 Javascript
jquery实现弹出层完美居中效果
2014/03/03 Javascript
jQuery三级下拉列表导航菜单代码分享
2020/04/15 Javascript
JS闭包与延迟求值用法示例
2016/12/22 Javascript
js实现动态显示时间效果
2017/03/06 Javascript
使用clipboard.js实现复制功能的示例代码
2017/10/16 Javascript
说说如何在Vue.js中实现数字输入组件的方法
2019/01/08 Javascript
Node.js一行代码实现静态文件服务器的方法步骤
2019/05/07 Javascript
Python制作爬虫抓取美女图
2016/01/20 Python
python生成词云的实现方法(推荐)
2017/06/13 Python
python决策树之CART分类回归树详解
2017/12/20 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
2018/04/08 Python
python 重定向获取真实url的方法
2018/05/11 Python
Python3爬虫爬取百姓网列表并保存为json功能示例【基于request、lxml和json模块】
2018/12/05 Python
Python多线程应用于自动化测试操作示例
2018/12/06 Python
Python基于yield遍历多个可迭代对象
2020/03/12 Python
基于python实现操作redis及消息队列
2020/08/27 Python
Pyinstaller打包Scrapy项目的实现步骤
2020/09/22 Python
Python 找出英文单词列表(list)中最长单词链
2020/12/14 Python
详解如何使用Pytest进行自动化测试
2021/01/14 Python
Django和Ueditor自定义存储上传文件的文件名
2021/02/25 Python
No7 Beauty美国官网:英国国民护肤品牌
2019/10/31 全球购物
商务考察邀请函范文
2014/01/21 职场文书
教师自我反思材料
2014/02/14 职场文书
《傅雷家书》教学反思
2014/04/20 职场文书
优秀共产党员事迹材料
2014/12/18 职场文书
劳资员岗位职责
2015/02/13 职场文书
初中生思想道德自我评价
2015/03/09 职场文书
2016年质量月活动总结报告
2016/04/05 职场文书
oracle DGMGRL ORA-16603报错的解决方法(DG Broker)
2021/04/06 Oracle