>  기사  >  백엔드 개발  >  Python3 실시간 작업을 사용하여 로그 파일을 처리하는 방법

Python3 실시간 작업을 사용하여 로그 파일을 처리하는 방법

PHPz
PHPz앞으로
2023-04-20 15:01:061272검색

1. 간단한 실시간 파일 처리(단일 파일)

실시간으로 읽으려는 로그의 경로가 /data/mongodb/shard1/log/pg.csv라고 가정합니다.

그런 다음 Python 파일의 쉘 스크립트 실시간 읽기 및 작업을 위한 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를 사용하면 새 프로세스를 생성하고 입력에 연결할 수 있습니다. /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: 실행할 셸 명령은 명령의 각 매개변수로 구성된 문자열 또는 시퀀스일 수 있습니다. 이 매개변수의 값이 문자열인 경우 명령의 해석 프로세스는 플랫폼에 따라 다르므로 일반적으로 args 매개변수를 시퀀스로 전달하는 것이 좋습니다.

  • stdin, stdout, stderr: 각각 프로그램의 표준 입력, 출력 및 오류 핸들을 나타냅니다.

  • shell: 실행할 프로그램으로 쉘을 사용할지 여부를 식별하는 데 사용되는 매개변수입니다. 쉘 값이 True인 경우 args 매개변수를 시퀀스가 ​​아닌 문자열로 전달하는 것이 좋습니다.

2. 복잡한 실시간 파일 처리(지속적으로 새 파일 생성)

로그가 특정 조건이 충족되면 새 로그 파일을 생성하는 경우(예: log1.csv가 20M에 도달하면 log2.csv는 하루에 1,000개 이상의 파일이 생성되고, 계속해서 새로운 파일이 생성되고 있는데 어떻게 실시간으로 얻을 수 있을까요?

아이디어는 다음과 같습니다.

실시간 모니터링에서 현재 파일의 크기 결정을 추가합니다(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)

위 내용은 Python3 실시간 작업을 사용하여 로그 파일을 처리하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제