티스토리 뷰

  • 문제
    • 여러개로 나뉘어진 로그파일에서 같은 requestId인 것들끼리 파일로 만들고 있음.
    • 작업하던 중 로그파일의 순서가 뒤엉켜서 에러가 발생.
      • 아래와 같은 파일이 있을 때
myapp_application.2023-07-19.0.log
myapp_application.2023-07-19.1.log
myapp_application.2023-07-19.2.log
myapp_application.2023-07-19.3.log
myapp_application.2023-07-19.9.log
myapp_application.2023-07-19.10.log
myapp_application.2023-07-19.11.log
    • 파이썬에서 listdir로 읽어들일 때는 아래의 순서로 읽어들이는 것을 발견함.
myapp_application.2023-07-19.0.log
myapp_application.2023-07-19.1.log
myapp_application.2023-07-19.10.log
myapp_application.2023-07-19.11.log
myapp_application.2023-07-19.2.log
myapp_application.2023-07-19.3.log
myapp_application.2023-07-19.9.log

 

  • 해결 목표
    • 로그파일의 인덱스를 3자리로 변경

 

  • 대응 방안 
    • 로그 파일 만드는 설정을 고쳐서 세자리로 만들기: 실패
      • 인덱스를 포맷하는 방법은 없는가봄.
    • 만들어진 로그파일을 변경
      • 정규식을 이용해서 처리: 불채택
        • 정규식에 익숙하지 않고 내가 아는 방법(group으로 이어붙임)을 사용하면 너무 복잡해짐
      • split해서 처리: 채택
        • 파일명 구조가 단순하고 정규식보다 이게 더 빠르고 알기 쉬움
  • 상세 대응
    • 아래와 같은 코드로 새로운 파일명을 제대로 가져오는지 출력해봄.
file_names = [
    'myapp_application.2023-07-19.0.log',
    'myapp_application.2023-07-19.1.log',
    'myapp_application.2023-07-19.2.log',
    'myapp_application.2023-07-19.3.log',
    'myapp_application.2023-07-19.9.log',
    'myapp_application.2023-07-19.10.log',
    'myapp_application.2023-07-19.11.log',
]

for file_name in file_names:
    file_name_split = file_name.split(".")
    while not len(file_name_split[2]) == 3:
        file_name_split[2] = '0' + file_name_split[2]
    new_file_name = ".".join(file_name_split)
    print(f'file_name:[{file_name}] -> [{new_file_name}]')

 

출력결과:
file_name:[myapp_application.2023-07-19.0.log] -> [myapp_application.2023-07-19.000.log]
file_name:[myapp_application.2023-07-19.1.log] -> [myapp_application.2023-07-19.001.log]
file_name:[myapp_application.2023-07-19.2.log] -> [myapp_application.2023-07-19.002.log]
file_name:[myapp_application.2023-07-19.3.log] -> [myapp_application.2023-07-19.003.log]
file_name:[myapp_application.2023-07-19.9.log] -> [myapp_application.2023-07-19.009.log]
file_name:[myapp_application.2023-07-19.10.log] -> [myapp_application.2023-07-19.010.log]
file_name:[myapp_application.2023-07-19.11.log] -> [myapp_application.2023-07-19.011.log]
  • 최종코드
import os
import shutil
import sys

if len(sys.argv) != 2:
    exit(1)

log_file_dir = sys.argv[1]

index_of_index = 2
target_index_length = 3

for file_name in os.listdir(log_file_dir):
    file_name_split = file_name.split(".")

    # 인덱스가 원하는 자릿수이면 처리안함
    if len(file_name_split[index_of_index]) == target_index_length:
        continue

    # 원하는 자릿수까지 앞에 0추가
    while not len(file_name_split[index_of_index]) == target_index_length:
        file_name_split[2] = '0' + file_name_split[2]
    new_file_name = ".".join(file_name_split)

    org_file_path = os.path.join(log_file_dir, file_name)
    new_file_path = os.path.join(log_file_dir, new_file_name)

    shutil.move(org_file_path, new_file_path)