Python

[모니터링] 파이썬을 활용한 로그 기록 - logging, logger

weweGH 2025. 5. 20. 09:00
반응형

 

모니터링 로그 기록
모니터링 로그 기록


파이썬을 활용한 로그 기록 - logging, logger


들어가며


파이썬의 logging로그 기록을 위한 패키지로 애플리케이션의 실행 상태, 디버깅 정보, 경고 및 에러 등을 기록할 수 있습니다. 이 글에서는 logging의 logger 객체에 대한 기본 사용법과 다양한 중요도의 로그 메시지를 생성하는 방법을 소개합니다.



로그 설정


logging은 별도의 패키지 설치없이 기본으로 제공되므로 import 구문으로 바로 사용할 수 있습니다.


logging.basicConfig

먼저 logging의 basicConfig를 활용하여 로그를 어떻게 기록할지에 대한 설정부터 시작합니다. 중요 옵션은 다음과 같습니다. 

  • level 옵션을 INFO로 설정하면, INFO 이상의 로그만 기록되며 DEBUG 수준의 로그는 기록되지 않습니다. 
  • filemode는 로그 파일을 어떻게 열지 지정하는 옵션입니다. 'a'는 기존 로그 뒤에 내용을 추가하고, 'w'는 기존 로그를 모두 지우고 새로 작성합니다.
옵션 설명
level 로그 레벨 설정 | DEBUG, INFO, WARNING, ERROR, CRITICAL
format 로그 메시지 형식 설정 | asctime(시간), levelname(로그 레벨), message(로그 메시지)
filename 로그 저장 파일명 설정
filemode 로그 파일 접근 모드 | a(append), w(write)

위의 옵션을 참고하여 아래의 조건을 만족하는 로그 설정은 다음과 같습니다.

INFO 레벨 이상 + (시간, 레벨, 메시지)를 기록 + 파일명(app.log) + 기존 로그에 추가 기록

import logging

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    filename=f'app.log',
    filemode='a'
)

logging.StreamHandler

StreamHandler를 추가하면 콘솔에도 로그를 출력할 수 있습니다.

logger = logging.getLogger()

# StreamHandler 추가 (콘솔 출력용)
console_handler = logging.StreamHandler()
console_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
logger.addHandler(console_handler)
반응형

로그 기록


위에서 basicConfigStreamHandler로 설정한 로그를 기록하는 방법은 다음과 같습니다. logging과 기록하려는 로그의 레벨을 함께 작성합니다. 즉, logging 뒤에 원하는 로그 레벨 이름을 붙이고 괄호 안에 메시지를 전달하면 됩니다.

logging.debug('에러 메시지를 작성하세요')
logging.info('에러 메시지를 작성하세요')
logging.warning('에러 메시지를 작성하세요')
logging.error('에러 메시지를 작성하세요')
logging.critical('에러 메시지를 작성하세요')

로그 기록 예제


로그 설정 코드로그 기록 코드를 통합하여 실행하면, 결과는 다음과 같이 파일과 콘솔에 모두 로그가 출력됩니다.

import logging

## 로그 설정
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    filename='app.log',
    filemode='a'
)


logger = logging.getLogger()

## StreamHandler 추가 (콘솔 출력용)
console_handler = logging.StreamHandler()
console_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
logger.addHandler(console_handler)

## 로그 기록
logging.debug('에러 메시지를 작성하세요')
logging.info('에러 메시지를 작성하세요')
logging.warning('에러 메시지를 작성하세요')
logging.error('에러 메시지를 작성하세요')
logging.critical('에러 메시지를 작성하세요')

app.log
콘솔 출력


실제 로그를 사용하는 방법은 다음과 같습니다. 예를 들어서, 사용자 ID가 짝수일 경우 정상 처리, 홀수면 에러를 발생하는 함수에서의 실행 방법입니다.

import logging

# 로그 파일 + 콘솔 설정
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    filename='app.log',
    filemode='a'
)

logger = logging.getLogger()

# 콘솔 출력 핸들러 추가
console_handler = logging.StreamHandler()
console_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
logger.addHandler(console_handler)

# user_id 처리 함수
def process_user(user_id):
    logger.info(f"사용자 {user_id} 정보 처리 시작")

    try:
        # 예: 사용자 ID가 짝수일 경우 정상 처리, 홀수면 에러 발생시킴
        if user_id % 2 == 0:
            logger.info(f"사용자 {user_id} 처리 완료")
        else:
            raise ValueError("올바르지 않은 사용자 ID")

    except Exception as e:
        logger.error(f"에러 발생: {e}")

# 함수 호출
process_user(2)   # 정상 처리
process_user(3)   # 에러 발생

반응형