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将多个文本文件合并为一个文本的代码(便于搜索)
Mar 13 Python
Django自定义分页与bootstrap分页结合
Feb 22 Python
Python探索之自定义实现线程池
Oct 27 Python
python如何派生内置不可变类型并修改实例化行为
Mar 21 Python
python实现数独游戏 java简单实现数独游戏
Mar 30 Python
python:pandas合并csv文件的方法(图书数据集成)
Apr 12 Python
PyQt实现界面翻转切换效果
Apr 20 Python
关于Python内存分配时的小秘密分享
Sep 05 Python
如何基于python操作excel并获取内容
Dec 24 Python
详解有关PyCharm安装库失败的问题的解决方法
Feb 02 Python
Python经纬度坐标转换为距离及角度的实现
Nov 01 Python
利用python查看数组中的所有元素是否相同
Jan 08 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中调用JAVA
2006/10/09 PHP
php 如何获取数组第一个值
2013/08/06 PHP
PHP上传图片时判断上传文件是否为可用图片的方法
2016/10/20 PHP
php使用fullcalendar日历插件详解
2019/03/06 PHP
自己做的模拟模态对话框实现代码
2012/05/23 Javascript
Javascript 构造函数详解
2014/10/22 Javascript
jQuery使用hide方法隐藏元素自身用法实例
2015/03/30 Javascript
JavaScript学习笔记(三):JavaScript也有入口Main函数
2015/09/12 Javascript
完美解决jQuery符号$与其他javascript 库、框架冲突的问题
2016/08/09 Javascript
javascript实现瀑布流动态加载图片原理
2016/08/12 Javascript
bootstrap flask登录页面编写实例
2016/11/01 Javascript
浅谈angularjs依赖服务注入写法的注意点
2017/04/24 Javascript
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
2017/06/12 jQuery
js实现文字列表无缝滚动效果
2017/06/23 Javascript
手挽手带你学React之React-router4.x的使用
2019/02/14 Javascript
JavaScript代码异常监控实现过程详解
2020/02/17 Javascript
JavaScript交换变量的常用方法小结【4种方法】
2020/05/07 Javascript
[02:44]2014DOTA2 国际邀请赛中国区预选赛 大神红毯秀
2014/05/25 DOTA
Python如何生成树形图案
2018/01/03 Python
PyQT实现多窗口切换
2018/04/20 Python
python flask框架实现重定向功能示例
2019/07/02 Python
Django模板Templates使用方法详解
2019/07/19 Python
python爬取Ajax动态加载网页过程解析
2019/09/05 Python
Python反爬虫伪装浏览器进行爬虫
2020/02/28 Python
基于python 凸包问题的解决
2020/04/16 Python
基于Python爬虫采集天气网实时信息
2020/06/05 Python
整理HTML5移动端开发的常用触摸事件
2016/04/15 HTML / CSS
捷克汽车配件和工具销售网站:TorriaCars
2018/02/26 全球购物
size?法国官网:英国伦敦的球鞋精品店
2020/03/15 全球购物
JoJo Maman Bébé爱尔兰官网:英国最受欢迎的精品母婴品牌
2020/12/20 全球购物
璀璨的珍珠、密钉和个性化珠宝:Lily & Roo
2021/01/21 全球购物
校园广播稿100字
2014/10/06 职场文书
就业指导讲座心得体会
2016/01/15 职场文书
使用 CSS 轻松实现一些高频出现的奇形怪状按钮
2021/12/06 HTML / CSS
《辉夜大小姐想让我告白》第三季正式预告
2022/03/20 日漫
Golang实现可重入锁的示例代码
2022/05/25 Golang