带你使用Python在两类场景下自动采集日志数据(附程序)

liftword2周前 (06-15)技术文章10


各位同学,大家好。采集日志数据是重要的数据来源。本次课程教大家使用Python技术从Windows和Linux两个环境去自动采集日志数据,轻松应对各类日志采集需求。

01 Python实时采集本地文件数据。

如果日志文件在本地,本地的操作系统是windows,可以这样来读取日志文件。

1. Subprocess

我们会使用Subprocess模块,Subprocess是Python内置的模块,这个模块中的Popen方法可以运行用户输入的命令行。如果运行正常,会把内容写入stdout管道。如果命令不正常,则把信息写入stderr管道。

Popen命令的基本格式是这样的:

shell=True 表示在终端中运行的命令,stdout=subprocess.PIPE 表示当命令运行正常的时候把结果写入stdout管道,stderr=subprocess.PIPE 表示的是当命令运行不正常的时候把结果写入stderr管道。

2.读取日志内容

我们使用以下的程序来实时读取日志内容:

其中的命令是powershell Get-Content –wait。

这是调用了Windows的powershell的Get-Content命令,来实时读取日志内容。

如果我们的操作系统是Linux,可以使用下面的程序来读取日志内容:

3.打印内容

读取到的结果通过以下程序来打印出来:

其中的readline是按照每行来读取内容,然后使用decode()将字节流转换成字符串,再使用strip方法,将内容中出现的/r和/n等字符删除。

最后使用communicate方法,将输出结果保存在内存中,而不是默认的保存到管道,这样存储能力更强,不容易卡死。这个进程将会一直执行直到外部程序来将它结束。

02 Python实时远程采集文件数据。

如果我们想远程采集linux服务器上面的日志信息,可以这样来操作。

1.创建ssh连接

Paramiko 是 Python 语言的一个 SSH 客户端。可以远程连接Linux服务器,通过 Python实现进行对远程服务器的操作。

创建SSH连接,我们使用以下程序来实现。

首先进行对paramiko下的SSHClient完成实例化。

然后使用
set_missing_host_key_policy() 方法,连接到没有已知主机秘钥的服务器。最后使用connect()方法,输入远程连接的地址、端口号,用户名,密码等信息。

2.通过ssh获取日志信息

接下来,我们使用以下程序来读取服务器日志。

我们使用exec_command()方法来执行tail –f命令,获取服务器日志信息。

其中ssh_stdin为标准输入流,通常用于向进程发送输入。

ssh_stdout为标准输出流,通常用于输出进程的结果。

ssh_stderr为标准错误流,通常用于输出进程的错误信息。

然后使用readline方法按照每行来读取内容,再使用strip方法,将内容中出现的/r和/n等字符删除。

最后结束ssh连接。

03 实例讲解。

接下来,我们给大家进行实例的讲解。

未完待续。

我是源动君,带领大家一起进步,谢谢观看。

相关文章

python中看见这三个场景,果断使用类,小白也能快速掌握

引言python中的 类 可是非常重要的知识点,非常多的同学 用不好,不会用,更不知道什么时候用。这篇文章我将告诉你一些类的应用场景,帮助你理解它。一、全局变量我们都学过全局变量,它非常好用,可以在整...

Python 集合的应用场景

Python集合的应用场景包括:去重:集合中的元素都是唯一的,可以用于去除列表或其他可迭代对象中的重复项。成员检查:可以快速地判断一个元素是否在集合中,这比在列表或其他可迭代对象中搜索要高效。数学操作...

Python多进程与多线程应用场景对比

在 Python 中,多进程(Multiprocessing)和多线程(Multithreading)的选择取决于任务类型(I/O 密集型 vs CPU 密集型)、Python 的 GIL 限制以及并...

python匿名函数lambda的语法特点和应用场景

在Python的编程过程中,有时我们会碰到一些很简单的计算,但是感觉专门为这个计算创建个函数又觉得太小题大做,这时就可以用到lambda表达式。lambda 是用于创建匿名函数,也就是没有具体名称的函...

Python 中的三个不寻常的事情 柯里化、海象和 Interning

柯里化柯里化是指不是一次性给函数所有参数,而是逐个给出。因此,每次都会创建一个新的函数。让我们看看 Python 中的快速手动实现 def add_curried(x): def inner(y)...