Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara menggunakan operasi masa nyata Python3 untuk memproses fail log

Cara menggunakan operasi masa nyata Python3 untuk memproses fail log

PHPz
PHPzke hadapan
2023-04-20 15:01:061220semak imbas

1. Pemprosesan fail masa nyata yang ringkas (fail tunggal)

Andaikan bahawa laluan log yang ingin kita baca dalam masa nyata ialah: /data/mongodb/shard1/log/pg.csv

Kemudian kita boleh menggunakan perintah skrip shell tail -F dalam fail python untuk membaca dan beroperasi dalam masa nyata

Kodnya adalah seperti berikut:

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

Ringkas penjelasan modul subproses:

Subproses membolehkan anda menghasilkan proses baharu, menyambung ke paip input/output/ralat dan mendapatkan kod (status) pulangannya.

Pengenalan kepada subproses.Popen

Kelas ini digunakan untuk melaksanakan subrutin dalam proses baharu.

Pembina subproses.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=())

Perihalan parameter:

  • args: Perintah shell untuk dilaksanakan, yang boleh menjadi rentetan atau Ia boleh menjadi urutan yang terdiri daripada pelbagai parameter arahan. Apabila nilai parameter ini ialah rentetan, proses tafsiran arahan adalah bergantung pada platform, jadi secara amnya disyorkan untuk lulus parameter args sebagai urutan.

  • stdin, stdout, stderr: masing-masing mewakili pengendalian input, output dan ralat standard program.

  • shell: Parameter ini digunakan untuk mengenal pasti sama ada untuk menggunakan shell sebagai program yang akan dilaksanakan Jika nilai shell adalah True, adalah disyorkan untuk menghantar parameter args sebagai rentetan bukannya sebagai satu urutan.

2. Pemprosesan fail masa nyata yang kompleks (menjana fail baharu secara berterusan)

Jika log akan menjana fail log baharu apabila syarat tertentu dipenuhi, seperti log1 .csv mempunyai Apabila ia mencapai 20M, log2.csv akan ditulis Dengan cara ini, akan terdapat lebih daripada 1,000 fail dalam sehari, dan yang baharu akan terus dihasilkan. Jadi bagaimana untuk mendapatkannya dalam masa nyata.

Ideanya adalah seperti berikut:

Tambahkan penentuan saiz fail semasa dalam pemantauan masa nyata (ekor -F Jika saiz fail semasa lebih daripada 20M, kemudian lompat keluar). pemantauan masa nyata dan mendapatkan fail log baharu. (Ini adalah idea yang sama jika terdapat syarat penghakiman lain, tetapi gantikan penghakiman saiz fail semasa dengan penghakiman yang anda perlukan)

Kodnya adalah seperti berikut:

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)

Atas ialah kandungan terperinci Cara menggunakan operasi masa nyata Python3 untuk memproses fail log. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam