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 Web服务器Tornado使用小结
May 06 Python
python控制台英汉汉英电子词典
Apr 23 Python
Python 实现简单的电话本功能
Aug 09 Python
mysql 之通过配置文件链接数据库
Aug 12 Python
Python中的id()函数指的什么
Oct 17 Python
Python DataFrame 设置输出不显示index(索引)值的方法
Jun 07 Python
对python requests的content和text方法的区别详解
Oct 11 Python
opencv导入头文件时报错#include的解决方法
Jul 31 Python
使用matplotlib绘制图例标签中带有公式的图
Dec 13 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
Jul 14 Python
Python图像识别+KNN求解数独的实现
Nov 13 Python
python help函数实例用法
Dec 06 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图片处理类 phpThumb参数用法介绍
2012/03/11 PHP
php从数组中随机选择若干不重复元素的方法
2015/03/14 PHP
解析PHP之提取多维数组指定列的方法
2017/01/03 PHP
PHP操作Redis数据库常用方法示例
2018/08/25 PHP
laravel 实现登陆后返回登陆前的页面方法
2019/10/03 PHP
可以用来调试JavaScript错误的解决方案
2010/08/07 Javascript
JavaScript中的style.display属性操作
2013/03/27 Javascript
JavaScript中的noscript元素属性位置及作用介绍
2013/04/11 Javascript
jQuery 删除或是清空某个HTML元素示例
2014/08/04 Javascript
jQuery实现图片文字淡入淡出效果
2015/12/21 Javascript
基于JavaScript实现下拉列表左右移动代码
2017/02/07 Javascript
es6学习笔记之Async函数的使用示例
2017/05/11 Javascript
bootstrap table单元格新增行并编辑
2017/05/19 Javascript
js+html5实现手机九宫格密码解锁功能
2018/07/30 Javascript
[42:35]2018DOTA2亚洲邀请赛3月30日 小组赛A组 VG VS OpTic
2018/03/31 DOTA
Python获取电脑硬件信息及状态的实现方法
2014/08/29 Python
Python实现将罗马数字转换成普通阿拉伯数字的方法
2017/04/19 Python
python 数据的清理行为实例详解
2017/07/12 Python
朴素贝叶斯分类算法原理与Python实现与使用方法案例
2018/06/26 Python
Python常见数字运算操作实例小结
2019/03/22 Python
【python】matplotlib动态显示详解
2019/04/11 Python
使用python将多个excel文件合并到同一个文件的方法
2019/07/09 Python
python接口自动化如何封装获取常量的类
2019/12/24 Python
天猫超市:阿里巴巴打造的网上超市
2016/11/02 全球购物
城野医生官方海外旗舰店:风靡亚洲毛孔收敛水
2018/04/26 全球购物
Yahoo-PHP面试题2
2014/12/06 面试题
本科生详细的自我评价
2013/09/19 职场文书
党员四风问题对照检查材料思想汇报
2014/09/16 职场文书
学生检讨书怎么写?
2014/10/10 职场文书
村党支部书记个人对照材料汇报
2014/10/26 职场文书
单位租车协议书
2015/01/29 职场文书
党内外群众意见范文
2015/06/02 职场文书
关于antd tree 和父子组件之间的传值问题(react 总结)
2021/06/02 Javascript
MySQL基础快速入门知识总结(附思维导图)
2021/09/25 MySQL
Apache Hudi的多版本清理服务彻底讲解
2022/03/31 Servers
Java虚拟机内存结构及编码实战分享
2022/04/07 Java/Android