CodeGym /행동 /Python SELF KO /스크립트의 안정적인 작동을 위한 로깅과 오류 처리

스크립트의 안정적인 작동을 위한 로깅과 오류 처리

Python SELF KO
레벨 38 , 레슨 0
사용 가능

1. 로깅

오늘은 여러분의 많은 신경과 소중한 시간을 구할 수 있는 주제인 로깅과 오류 처리에 대해 알아볼 거야. 아무리 경험 많은 프로그래머라도 에러에서 자유로울 수 없으니 우리의 목표는 이 에러를 예측 가능하고 관리 가능하게 만드는 거야. 넌 마치 고고학자처럼 발굴 작업을 진행하면서 예상치 못한 위험 요소를 피해야 해. 이때 로깅과 오류 처리가 여러분의 믿음직한 나침반이자 방패가 될 거야!

코딩에서 로깅이란 프로그램 작동 정보 기록을 말하는데, 이는 코드 내부에서 일어나는 일을 보여줄 단서 같은 거야. 로깅은 '헨젤과 그레텔' 동화에서처럼 돌아갈 길을 찾도록 빵 부스러기를 남기는 것과 유사한 개념이야.

로깅 설치 및 설정

Python에서 사용하는 주요 도구로 시작해보자. 로깅에 logging 모듈을 사용할 거야. 이건 프로그램 실행 과정을 기록하기 위한 스위스 군용 칼과 같은 도구야.

Python

import logging

# 로깅 설정
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# 사용 예시
logging.info("스크립트 시작")
logging.error("이것은 에러입니다.")

        

로깅에는 어떤 레벨이 있을까?

  • DEBUG: 디버깅 시에만 흥미로운 상세 정보.
  • INFO: 예상대로 작동한다는 것을 확인.
  • WARNING: 예상치 못한 상황이나 문제 가능성, 하지만 프로그램은 계속 작동.
  • ERROR: 기능 실행 실패를 초래하는 심각한 오류.

원하는 정보만 필터링하려면 로깅 수준을 설정할 수 있어. 예를 들어, 오류와 경고만 보고 싶다면 logging.WARNING으로 설정해봐.

Selenium에서 로깅 예제

Selenium 프로젝트에서 로깅이 어떻게 사용될 수 있는지 확인해보자:

Python

from selenium import webdriver

# 로깅 설정
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

try:
    logging.info("Chrome 드라이버 초기화")
    driver = webdriver.Chrome()
    logging.info("Python.org 페이지 열기")
    driver.get("https://www.python.org")
    logging.info("작업 성공적으로 완료됨")
except Exception as e:
    logging.error(f"에러 발생: {e}")
finally:
    driver.quit()

        

이 예시는 Selenium 스크립트에 로깅을 통합하여 실행 과정을 추적하는 방법을 보여줘. 우리는 try, except, 그리고 finally를 사용해서 오류를 처리하지. 아래 더 자세히 알아볼게.

2. Selenium에서 오류 처리

프로그래밍, 혹은 인생에서도, 에러는 피할 수 없어. 하지만 우리가 에러에 어떻게 반응할지 제어할 수 있어. try, except, else, finally를 사용하면 에러를 우아하게 처리할 수 있지.

예외 처리 다시 보기

한번 예외 처리가 어떻게 작동하는지 복습해보자:

Python

try:
    # 예외 발생 가능한 코드
    result = 10 / 0
except ZeroDivisionError as e:
    # 예외 발생 시 실행될 코드
    logging.error("0으로 나눌 수 없습니다!")
else:
    # 예외가 발생하지 않으면 실행될 코드
    logging.info("작업 성공적으로 완료됨")
finally:
    # 항상 실행될 코드
    logging.info("작업 완료")

        

try 블록 안 코드는 실행돼. 만약 ZeroDivisionError 유형의 오류가 발생하면 except 블록 코드가 실행되면서 프로그램이 죽지 않지. else는 오류가 없을 때 실행되고, finally는 오류 발생 여부와 상관없이 항상 실행돼.

Selenium에서의 예외 처리

Selenium에는 다양한 상황을 처리할 수 있는 몇 가지 내장된 예외가 있어. 유용한 몇 가지 예외를 확인하고 이를 사용하는 방법을 알아보자.

  1. NoSuchElementException — 요소가 발견되지 않을 때 발생. 요소 액세스 가능 여부를 확인할 때 사용해봐.
    Python
    
    try:
        element = driver.find_element(By.ID, "element_id")
    except NoSuchElementException:
        logging.warning("ID가 'element_id'인 요소를 찾을 수 없습니다.")
    
                    
  2. TimeoutException — 기대하는 요소가 설정된 시간 내에 페이지에 나타나지 않을 때 발생. 대기 관리를 위해 사용해봐.
    Python
    
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    try:
        element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "element_id"))
        )
    except TimeoutException:
        logging.error("ID가 'element_id'인 요소 대기가 실패했습니다.")
    
                    
  3. ElementClickInterceptedException — 다른 요소에 의해 차단되어 클릭이 불가능할 때 발생. 팝업에 의해 가려질 수 있는 클릭 요소에서 유용해.
    Python
    
    from selenium.common.exceptions import ElementClickInterceptedException
    
    try:
        driver.find_element(By.ID, "button_id").click()
    except ElementClickInterceptedException:
        logging.warning("다른 요소에 의해 차단되어 요소를 클릭할 수 없습니다.")
    
                    

재시도와 복구 논리

스크립트의 안정성을 높이려면, 문제가 발생했을 때 여러 번 시도를 해보는 재시도 메커니즘을 구현할 수 있어. 예를 들어, 사이트가 일시적으로 다운되었거나 요소를 찾지 못했을 때 작업 오류를 리턴하기 전 몇 차례 더 시도하게 할 수 있지.

Python

import time

def retry_find_element(driver, by, value, retries=3):
    attempt = 0
    while attempt < retries:
        try:
            element = driver.find_element(by, value)
            logging.info(f"요소 찾기 성공: {value}")
            return element
        except NoSuchElementException:
            attempt += 1
            logging.warning(f"시도 {attempt} 실패, 2초 후 재시도...")
            time.sleep(2)
    logging.error(f"{retries}번 시도 후에도 요소를 찾을 수 없습니다.")
    return None

        

스크립트 안정성과 신뢰성을 위한 팁

  • 명시적 대기 사용: 즉시 나타나지 않는 요소에 대한 대기를 설정해. 이는 로딩 지연으로 인한 오류를 줄여준다고.
  • 모든 단계에서 try-except 사용: 이렇게 하면 에러를 기록하고 사소한 문제로 스크립트가 중단되지 않도록 할 수 있어.
  • 중요 단계에 반복 시도 구현: 오류가 일시적인 것일 수 있으므로 몇 초 간격으로 반복 시도를 설정해봐.
  • 각 단계 로깅: 주요 단계를 로깅하면 스크립트 실행 과정을 분석하고 숨겨진 오류를 포착하는 데 도움이 돼.
  • 중요한 오류에 대한 알림 설정: 예를 들어, CRITICAL 수준의 오류가 로그에 기록되면 이메일이나 채팅 메시지를 보낼 수 있어.

3. 유용한 로깅 활용

이제 로깅과 오류 처리에 대해 배웠으니, 로깅에서 최대의 이점을 얻는 방법으로 한 걸음 더 나아가보자.

로그 저장 위치와 형식 선택

분석 목적으로 로그를 저장하려면 파일을 사용하는 게 좋아. 이건 일기를 기록하고 다시 읽으면서 분석하는 것과 비슷해. 파일에 로그를 저장하도록 로깅을 설정해보자:

Python

logging.basicConfig(filename='app.log', filemode='w', level=logging.INFO)

# 이제 모든 로그가 app.log에 저장됩니다.
logging.info("파일에 로그 기록 시작.")

        

로그 분석

로그를 분석하여 자주 발생하는 오류나 성능 문제를 찾아봐. 예를 들어, 스크립트가 특정 요일이나 시간대에만 문제를 겪는다면 이는 로그를 세부적으로 분석할 때만 알아낼 수 있을 거야. 이 분석은 앱이 어떻게 작동하는지 더 잘 이해하기 위한 여러분만의 탐정 과정과도 같아.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION