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


猜你喜欢
- 尾递归是一种特殊的递归形式,它在递归调用时不会产生新的栈帧,从而避免了栈溢出的问题。Python并没有对尾递归进行优化,但我们可以通过一些技
- 本文实例为大家分享了python使用itchat实现手机控制电脑的具体代码,供大家参考,具体内容如下1.准备材料首先电脑上需要安装了pyth
- 目录生成迷宫走出迷宫可视化总结相信大家都玩过迷宫的游戏,对于简单的迷宫,我们可以一眼就看出通路,但是对于复杂的迷宫,可能要仔细寻找好久,甚至
- 呵呵,这几天沉溺于灌水,发现转贴的时候真的是很不方便,文字、图形、颜色、连接,如果都转过来真的是满费劲的,于是就写了一个小东西,简陋的很,不
- 这里先解释一下几个概念 - 位置参数:按位置设置的参数,隐式用元组保存对应形参.平时我们用的大多数是按位置传参.比如有函数def func(
- 在技术更新的进程中, 仍然有一些人死抱着已经过了气的东西不放. 也有一些人虽然进入到新的世界, 但仍摆脱不了陈
- os.remove不能用来删除文件夹,否则拒绝访问。# -*- coding:utf-8 -*-import osif __name__ =
- 1、安装mysql有InnoDB的插件扩展 ./configure --prefix=/usr/local/mysql --with-plu
- F.avg_pool1d()数据是三维输入input维度: (batch_size,channels,width)channel可以看成高度
- 前言众所周知在Python中有专门用于logger打印的套件叫logging,但是该套件logger仅接收一个字符串类型的logger打印信
- 数据预处理在解决深度学习问题的过程中,往往需要花费大量的时间和精力。 数据处理的质量对训练神经网络来说十分重要,良好的数据处理不仅会加速模型
- Python中专门提供了telnetlib库,用来完成基于telnet协议的通信功能。python3下使用telnetlib模块连接网络设备
- #!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2020/02/11
- 对于路径中含有中文的图像,直接用cv2.imread读取会报错,上次看到有大佬使用cv2.imdecode就可以正常读取,有点好奇,所以今天
- 之前在做数据分析的过程中,需要对数据进行实时的写入,比如对新生成的数据写入之前已经生成的txt或csv文件中。现在想想其实很简单,所以做一个
- 本文实例讲述了Python字典生成式、集合生成式、生成器用法。分享给大家供大家参考,具体如下:字典生成式:跟列表生成式一样,字典生成式用来快
- 阅读上一章:Chapter 14 图片替换Chapter 15 为<body>指定样式把内容与显示效果分开设定的好处之一就是灵活
- 前言手里有一点点公司的股票, 拿不准在什么时机抛售, 程序员也没时间天天盯着看,不如动手写个小程序, 把股票趋势每天早上发到邮箱里,用 py
- MySQL分页分析原理及提高效率PERCONA PERFORMANCE CONFERENCE 2009上,来自雅虎的几位工程师带来了一篇”E
- 前言:记一次golang使用json进行对象copy的内存溢出问题排查问题现象:新增的功能,灰度部署在k8s集群的服务,发现机器老是被打崩,