Python3实时操作处理日志文件的实现
作者:猪笨是念来过倒 发布时间:2022-09-01 21:21:16
最近,需要对日志文件进行实时数据处理。
一、简单的实时文件处理(单一文件)
假设我们要实时读取的日志的路径为: /data/mongodb/shard1/log/pg.csv
那么我们可以在python文件中使用shell脚本命令tail -F 进行实时读取并操作
代码如下:
import re
import codecs
import subprocess
def pg_data_to_elk():
p = subprocess.Popen('tail -F /data/mongodb/shard1/log/pg.csv', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE,) #起一个进程,执行shell命令
while True:
line = p.stdout.readline() #实时获取行
if line: #如果行存在的话
xxxxxxxxxxxx
your operation
简单解释一下subprocess模块:
subprocess允许你生成新的进程,连接到它们的 input/output/error 管道,并获取它们的返回(状态)码。
subprocess.Popen介绍
该类用于在一个新的进程中执行一个子程序。
subprocess.Popen的构造函数
class subprocess.Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None,
preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=False,
startup_info=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=())
参数说明:
args: 要执行的shell命令,可以是字符串,也可以是命令各个参数组成的序列。当该参数的值是一个字符串时,该命令的解释过程是与平台相关的,因此通常建议将args参数作为一个序列传递。
stdin, stdout, stderr: 分别表示程序标准输入、输出、错误句柄。
shell: 该参数用于标识是否使用shell作为要执行的程序,如果shell值为True,则建议将args参数作为一个字符串传递而不要作为一个序列传递。
二、复杂的实时文件处理(不断产生新文件)
如果日志会在满足一定条件下产生新的日志文件,比如log1.csv已经到了20M,那么则会写入log2.csv,这样一天下来大概有1000多个文件,且不断产生新的,那么如何进行实时获取呢?
思路如下:
在实时监听(tail -F)中加入当前文件的大小判定,如果当前文件大小大于20M,那么跳出实时监听,获取新的日志文件。(如果有其他判定条件也是这个思路,只不过把当前文件大小的判定换成你所需要的判定)
代码如下:
import re
import os
import time
import codecs
import subprocess
from datetime import datetime
path = '/home/liao/python/csv'
time_now_day = datetime.now.strftime('%Y-%m-%d')
def get_file_size(new_file):
fsize = os.path.getsize(new_file)
fsize = fsize/float(1024*1024)
return fsize
def get_the_new_file():
files = os.listdir(path)
files_list = list(filter(lambda x:x[-4:]=='.csv' and x[11:21]==time_now_day, files))
files_list.sort(key=lambda fn:os.path.getmtime(path + '/' + fn) if not os.path.isdir(path + '/' + fn) else 0)
new_file = os.path.join(path, files_list[-1])
return new_file
def pg_data_to_elk():
while True:
new_file = get_the_new_file()
p = subprocess.Popen('tail -F {0}'.format(new_file), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE,) #起一个进程,执行shell命令
while True:
line = p.stdout.readline() #实时获取行
if line: #如果行存在的话
if get_file_size(new_file) > 20: #如果大于20M,则跳出循环
break
xxxxxxxxxxxx
your operation
time.sleep(3)
来源:https://blog.csdn.net/liao392781/article/details/85598277
猜你喜欢
- 支持多种编码的中文字符串截取函数! /* * @todo&
- 需要准备环境:python3.6、vultr(或者其他服务器)、xshell第一步:python安装必备环境Django库Xshell链接远
- 很久以前写过如何成为优秀的设计师,近半年来经常做设计评审,有很多感触,顺便写一点下来,我们的Blog也应该有更高的更新频率。言归正传,我认为
- 为了方便使用分类,我定义了一个分类表category,里面字段是id(自动编号) cat_name(分类名) pare
- 揭秘一个普通的输入框背后惊人的秘密。某月某日,某项目某页面,需要一个价格区间筛选功能,需求合理,所以设计做上去。这是一个无比普通的输入框。在
- 先导入模块:from django.core.paginator import Paginator, EmptyPage, PageNotA
- 情况1: father.php如下定义: <?php $jack = 1000; ?> children.php 如下定义: &
- Css tranistions允许元素的属性在单位时间内发生平滑的过渡,在阅读完《CSS Transitions Module Level
- (1)安装Jpype 用Python调用jar包需要安装jpype扩展,在Ubuntu上可以直接使用apt-get安装jpype扩展$ su
- 一、前言:Thrift 是一种接口描述语言和二进制通信协议。以前也没接触过,最近有个项目需要建立自动化测试,这个项目之间的微服务都是通过 T
- asp之家注:本篇asp留言本教程可以说是我见过的最详细,写的最认真的,最适合初学者来学习asp的一篇教程。在此感谢作者hemooday。可
- 把程序重新写了一遍,日期下拉选择器,可自定义日期范围。使用了一个技巧获取指定月份的天数。演示页面:DateSelector.htm 程序代码
- 摘要: 本文由简到繁地介绍了以jQuery作为蓝本的js框架开发步聚, 希望借助本文大家对jQuery这样的框架内部有一个大致的认识。推荐:
- 引言解释器环境:python3.5.1我们都知道python网络编程的两大必学模块socket和socketserver,其中的socket
- 前言:Requests简介Requests 是使用Apache2 Licensed 许可证的 HTTP 库。用 Python 编写,真正的为
- 在数据科学和机器学习中,我们通常会处理大量的数据,这些数据可能会超过计算机的内存限制,因此我们需要一种方法来读取大型数据文件。在 Pytho
- 本文实例为大家分享了Python版名片管理系统的具体代码,供大家参考,具体内容如下先建立cards_main的文件import cards_
- 1. Numpy(Numberical Python)Anaconda中已经集成了NumPy,可以直接使用。如果想要自行安装的话,可以使用流
- 需求:从服务器拷贝照片到本地,然后再从本地照片筛选照片。问题:从服务器拷贝到照片本地,太慢,速度只有20~30K,不能忍。然后想到,利用py
- 通过文件夹导入包要求每个目录下都有一个__init__.py文件,此文件可空白。也可不空。a@ubuntu:~/Desktop$ tree