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中字典的基本知识初步介绍
May 21 Python
Python实现批量将word转html并将html内容发布至网站的方法
Jul 14 Python
浅谈Python数据类型之间的转换
Jun 08 Python
用python实现对比两张图片的不同
Feb 05 Python
Python学习小技巧总结
Jun 10 Python
python正则表达式匹配[]中间为任意字符的实例
Dec 25 Python
python绘制已知点的坐标的直线实例
Jul 04 Python
Flask框架学习笔记之模板操作实例详解
Aug 15 Python
详解Flask前后端分离项目案例
Jul 24 Python
Django DRF APIView源码运行流程详解
Aug 17 Python
Pytorch 中的optimizer使用说明
Mar 03 Python
Python控制台输出俄罗斯方块的方法实例
Apr 17 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基础知识:类与对象(4) 范围解析操作符(::)
2006/12/13 PHP
一些PHP Coding Tips(php小技巧)[2011/04/02最后更新]
2011/05/02 PHP
php判断文件夹是否存在不存在则创建
2015/04/09 PHP
PHP实现获取并生成数据库字典的方法
2016/05/04 PHP
thinkPHP5.1框架使用SemanticUI实现分页功能示例
2019/08/03 PHP
TNC vs IO BO3 第一场2.13
2021/03/10 DOTA
css配合jquery美化 select
2013/11/29 Javascript
jquery.post用法关于type设置问题补充
2014/01/03 Javascript
JavaScript调试技巧之console.log()详解
2014/03/19 Javascript
JavaScript中数据结构与算法(五):经典KMP算法
2015/06/19 Javascript
JS实现带有3D立体感的银灰色竖排折叠菜单代码
2015/10/20 Javascript
几种二级联动案例(jQuery\Array\Ajax php)
2016/08/13 Javascript
Javascript中引用类型传递的知识点小结
2017/03/06 Javascript
Angularjs 1.3 中的$parse实例代码
2017/09/14 Javascript
[31:00]2014 DOTA2华西杯精英邀请赛5 24 NewBee VS iG
2014/05/25 DOTA
python利用OpenCV2实现人脸检测
2020/04/16 Python
python 获取url中的参数列表实例
2018/12/18 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
2019/06/18 Python
网页切图的CSS和布局经验与要点
2015/04/09 HTML / CSS
详解Canvas 跨域脱坑实践
2018/11/07 HTML / CSS
Deichmann英国:德国鞋类零售商
2021/01/30 全球购物
JAVA高级程序员面试题
2013/09/06 面试题
文秘专业大学生求职信
2013/11/10 职场文书
餐饮业的创业计划书范文
2013/12/26 职场文书
校园之声广播稿
2014/01/31 职场文书
高中生职业生涯规划书
2014/02/24 职场文书
2014年社区卫生工作总结
2014/12/18 职场文书
教师岗位职责范本
2015/04/02 职场文书
房地产财务经理岗位职责
2015/04/08 职场文书
运动会运动员赞词
2015/07/22 职场文书
学会掌握自己命运的十条黄金法则:
2019/08/08 职场文书
Python基础之教你怎么在M1系统上使用pandas
2021/05/08 Python
vue+elementui 实现新增和修改共用一个弹框的完整代码
2021/06/08 Vue.js
Springboot如何使用logback实现多环境配置?
2021/06/16 Java/Android
Vue实现tab导航栏并支持左右滑动功能
2021/06/28 Vue.js
CentOS 7安装mysql5.7使用XtraBackUp备份工具命令详解
2022/04/12 MySQL