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.
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!