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

Cara menggunakan operasi masa nyata Python3 untuk memproses fail log

PHPz
Lepaskan: 2023-04-20 15:01:06
ke hadapan
1292 orang telah melayarinya

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
Salin selepas log masuk

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=())
Salin selepas log masuk

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)
Salin selepas log masuk

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!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan