[challenge] 5회차

Hyunjun Kim·2024년 12월 16일

python Challenge

목록 보기
4/5

[목표]

  • 로깅: loguru을 사용하여 다양한 로그 레벨로 메시지를 기록하고, 로그 파일로 저장하여 ETL 작업 추적
  • 스케줄링: schedule을 사용하여 주기적으로 실행해야 하는 작업을 예약하고 자동화
  • YAML 파일 관리: PyYAML을 사용하여 YAML 파일을 읽고 쓰며, 애플리케이션 설정을 관리

📜 01. 로깅

로깅은 애플리케이션에서 발생하는 다양한 이벤트를 추적하는 중요한 도구입니다. 코드의 실행 시간, 실행한 위치, 오류 발생 지점 등을 기록함으로써 디버깅을 더 쉽게 할 수 있습니다.

이번 강의에서는 loguru 라이브러리를 활용하여 로그 레벨별로 로그를 기록하는 방법을 배워보겠습니다. 아래는 로그 심각도 수준에 따른 순서입니다.
(TRACE < DEBUG < INFO < WARNING < ERROR < CRITICAL)

  • TRACE: 세부적인 정보를 기록 (예: 함수 진입/출력, 변수 값 추적 등)
  • DEBUG: 디버깅 및 개발 중 필요한 정보 기록 (예: 함수 호출, 변수 값 등)
  • INFO: 일반적인 정보 메시지 (예: 시스템 시작, 중요한 작업 완료 등)
  • WARNING: 경고 메시지 (예: 예기치 않은 상황, 잠재적인 오류 발생 가능성 등)
  • ERROR: 오류 메시지 (예: 예외 발생, 시스템 장애 등)
  • CRITICAL: 심각한 오류 메시지 (예: 시스템 다운 등)

먼저 필요한 패키지를 설치하겠습니다

pip install loguru

01-1. 기본 사용법

from loguru import logger
# 로그 레벨별 메시지 출력
logger.debug("디버그 메시지입니다.")  # 디버깅 메시지
logger.info("정보 메시지입니다.")  # 일반적인 정보 메시지
logger.warning("경고 메시지입니다.")  # 경고 메시지
logger.error("에러 메시지입니다.")  # 에러 메시지
logger.critical("심각한 에러 메시지입니다.")  # 심각한 에러 메시지

01-2. 로그 파일에 기록하기

from datetime import datetime

# 로그 파일 이름 생성
current_datetime = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
log_filename = f"etl_process_{current_datetime}.log"

# 로그를 파일로 기록
logger.add(log_filename)

# 로그 메시지 출력
logger.info("정보 메시지입니다.")

01-3. 로그 레벨 설정

모든 로그를 저장 할 필요는 없습니다. level="WARNING"로 설정하면 WARNING 이상의 중요도를 가진 로그만 기록됩니다.

# WARNING 이상의 로그만 기록
logger.add("logfile_level.log", level="WARNING")
logger.debug("디버그 메시지입니다.") # 기록되지 않음
logger.warning("경고 메시지입니다.") # 기록됨

01-4. 로그의 출력 형식 설정

로그의 출력형식을 변경 할 수 있습니다. 예를 들어, 시간에서 milisecond 단위를 제거하고 level 이랑 message 만 포함 할 수 있게 파일에 출력하겠습니다.

logger.add("logfile_format.log", format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}")
logger.info("정보 메시지")

01-5. 기타 파라미터

  • rotation: 로그 파일 회전 (로그 파일 크기나 시간 기준으로 회전)
  • retention: 오래된 로그 파일 삭제
  • compression: 로그 파일 압축

[참고 블로그 - loguru를 사용하여 python 로깅 쉽게하기]




⏰ 02. 스케줄링

schedule 라이브러리를 사용하여 주기적인 작업을 설정하고 관리하는 방법을 알아보겠습니다.

먼저 필요한 패키지를 설치하겠습니다

pip install schedule

02-1. 기본 사용법

  1. job() 함수가 1초마다 실행되도록 설정합니다. schedule.every()를 사용하여 주기적으로 실행할 시간을 설정하고, do()를 통해 실행할 작업을 지정합니다.
  2. 스케줄을 설정하고 나서 실제로 schedule.run_pending() 을 통해 설정한 스케줄을 실행합니다.
import schedule
import time

# 실행할 함수 정의
def job():
    print("작업이 실행되었습니다!")

# 1초마다 작업 실행
schedule.every(1).seconds.do(job)

# 스케줄러 실행
while True:
    schedule.run_pending()  # 예약된 작업이 있으면 실행
    time.sleep(1)  # 1초마다 체크

02-2. 다양한 주기 설정

이외 다양한 방법으로 스케줄 주기를 설정할 수 있습니다.

  • 10초마다 실행
  • 1분마다 실행
  • 매일 자정에 실행
  • 매주 월요일 9시에 실행
# 10초마다 실행
schedule.every(10).seconds.do(job)

# 1분마다 실행
schedule.every(1).minute.do(job)

# 매일 자정에 실행
schedule.every().day.at("00:00").do(job)

# 매주 월요일 9시에 실행
schedule.every().monday.at("09:00").do(job)

📄 03. YAML

  • YAMLYAML Ain’t Markup Language의 약자로, 사람이 읽기 쉬운 데이터 직렬화 형식입니다.
  • 데이터 파이프라인은 다양한 설정과 구성이 필요하기 때문에 복잡해질 수 있습니다. 이때 YAML 파일을 사용하면 설정을 보다 간편하게 관리할 수 있습니다. 예를 들어, 데이터 소스, 처리 방식, 출력 위치, 스케줄링 정보 등을 YAML 파일로 정의하면 파이프라인을 더 쉽게 설정하고 관리할 수 있습니다.

🤨 .env 파일과의 차이점

  • .env 파일은 주로 애플리케이션의 환경 변수를 저장하는 데 사용됩니다. 예를 들어, 데이터베이스 연결 정보나 API 키와 같은 비밀 정보를 관리할 때 유용합니다.
  • 반면, YAML 파일은 애플리케이션의 구성 정보를 저장하는 데 사용됩니다. 예를 들어, 데이터 파이프라인 일정, 로그 출력 위치 등을 계층적인 형태로 정의할 수 있습니다.
  • 결국 .env 파일은 주로 환경 변수나 민감한 정보를 저장하는 데 사용되고, YAML은 자동화 부분의 설정이나 구성을 관리하는 데 적합합니다.

먼저 필요한 패키지를 설치하겠습니다.

pip install pyyaml

03-1. YAML 파일 작성 (config.yaml)

log_folder_path: "./etl_module/logs"
cities:
  - "New York"
  - "Los Angeles"
  - "Chicago"
  - "Houston"
  - "Phoenix"
run_minutes: 5

03-2. YAML 파일 읽기

import yaml

# YAML 파일 경로
yaml_file_path = 'config.yaml'

# YAML 파일을 읽어 Python 객체로 변환
with open(yaml_file_path, 'r') as yaml_file:
    config = yaml.safe_load(yaml_file)

# 읽은 데이터 출력
print(config.get('log_folder_path'))  # 로그 폴더 경로 출력
print(config.get('cities'))  # 도시 목록 출력

🔧 04. 파이프라인에 추가 (Live)

❓ 05. Q&A

  • Python 만을 활용해서 ETL 데이터 파이프라인을 설계했습니다.
    이외 이를 자동화 할 수 있는 다양한 툴이 존재해요.
    - Airbyte : https://airbyte.com
    - ELT 파이프라인의 Extract & Load 부분을 담당
    - API 에서 데이터 불러오는 부분 등 손쉽게 설정 가능
    - dbt : https://www.getdbt.com
    - Data-Build-Tool
    - Analytics Engineer 가 많이 활용함
    - ELT 나 ELT 에서 Transform 을 담당
    - Scheduling Tools
    - Airflow : https://airflow.apache.org
    - dagster : https://dagster.io
  • 5회차 동안 열심히 수강하시느라 고생 많으셨습니다. 👏👏👏
  • Give yourselves a pat on the back!
profile
Data Analytics Engineer 가 되

0개의 댓글