[파이썬] subprocess 로그 관리하기

Python subprocess 모듈은 외부 프로그램을 실행하고 제어하는 데 사용되는 강력한 도구입니다. 하지만 subprocess 모듈을 사용할 때 발생하는 로그 관리는 때로 어려움을 겪을 수 있습니다. 이번 블로그 포스트에서는 subprocess 모듈을 사용하여 로그를 관리하는 방법에 대해 알아보겠습니다.

로그 파일 생성하기

먼저, 실행한 프로세스의 로그를 저장할 파일을 생성해야 합니다. 로그 파일을 생성하기 위해 open() 함수를 사용하고, subprocess.PIPE를 사용하여 프로세스의 출력을 잡아낼 수 있습니다. 예를 들어, 다음과 같은 코드를 사용하여 로그 파일을 생성할 수 있습니다:

import subprocess

def run_command(command, log_file):
    with open(log_file, 'w') as f:
        # subprocess 모듈을 사용하여 외부 프로세스 실행
        process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)

        # 프로세스의 출력을 로그 파일에 기록
        for line in iter(process.stdout.readline, b''):
            f.write(line.decode())

        # 프로세스가 끝날 때까지 대기
        process.wait()

로그 파일에 메시지 추가하기

실행할 프로세스의 로그를 파일에 저장하는 방법을 알았으니 이제는 에러 메시지나 다른 중요한 로그를 로그 파일에 추가하는 방법을 알아보겠습니다. 이를 위해 logging 모듈을 사용할 수 있습니다. logging 모듈을 사용하여 로그 파일에 메시지를 추가하는 예제 코드를 작성해 보겠습니다:

import subprocess
import logging

def run_command(command, log_file):
    logging.basicConfig(filename=log_file, level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

    # subprocess 모듈을 사용하여 외부 프로세스 실행
    process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)

    # 프로세스의 출력을 로그 파일에 추가
    for line in iter(process.stdout.readline, b''):
        logging.info(line.decode())

    # 프로세스가 끝날 때까지 대기
    process.wait()

이제 logging 모듈을 사용하여 로그 파일에 메시지를 추가할 수 있습니다. logging.basicConfig() 함수를 사용하여 로그 파일의 경로, 로그 레벨 및 메시지 형식을 설정합니다. 그런 다음 logging.info() 함수를 사용하여 원하는 메시지를 로그 파일에 추가할 수 있습니다.

로그 파일 삭제하기

로그 파일에는 새로운 로그 정보가 추가될 때마다 크기가 계속해서 커질 것입니다. 따라서 어느 시점 이후에 로그 파일을 삭제하는 메커니즘이 필요할 수 있습니다. 이를 위해 os 모듈을 사용하여 파일을 삭제할 수 있습니다. 다음은 로그 파일을 삭제하는 예제 코드입니다:

import subprocess
import logging
import os

def run_command(command, log_file):
    logging.basicConfig(filename=log_file, level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

    # ...

    # 프로세스가 끝날 때까지 대기
    process.wait()

    # 로그 파일 삭제
    os.remove(log_file)

위의 코드에서 run_command() 함수는 프로세스가 종료된 후에 os.remove() 함수를 사용하여 로그 파일을 삭제합니다. 이렇게 하면 로그 파일이 너무 커지는 것을 방지할 수 있습니다.

결론

이 블로그 포스트에서는 subprocess 모듈을 사용하여 로그를 관리하는 방법에 대해 알아보았습니다. 로그 파일을 생성하고 메시지를 추가하며 필요한 경우 로그 파일을 삭제하는 기능을 구현하는 방법을 살펴보았습니다. 이제 subprocess 모듈을 사용하여 외부 프로세스를 실행할 때 로그를 효과적으로 관리할 수 있을 것입니다.

참조 링크: