티스토리 뷰

반응형

Logging

로그는 서버에서 많이 사용되는 도구로, 우리가 작성한 코드가 정상적으로 동작하는지, 어떤 오류가 발생했는지 등을 추적하기 위해 사용됩니다. Python에서는 logging 모듈을 이용하여 로그를 출력할 수 있습니다.

logging 모듈을 사용하면, 로그를 어떤 형식으로든 출력할 수 있습니다. 예를 들어, 파일에 저장하거나 콘솔에 출력하는 등의 방법으로 로그를 확인할 수 있습니다. 이를 통해 우리는 코드의 동작 상황을 쉽게 파악하고, 문제가 발생했을 때 빠르게 대응할 수 있습니다.

또한, logging 모듈은 다양한 로그 레벨을 제공하여, 우리가 관심 있는 부분에 대해서만 로그를 출력할 수 있습니다. 예를 들어, 디버그 모드에서는 모든 로그를 출력하고, 운영 모드에서는 오류 메시지만 출력하도록 설정할 수 있습니다.

Python logging 모듈을 사용하는 방법을 익히면, 코드의 효율성과 유지보수성을 높일 수 있습니다. 따라서, logging 모듈의 사용법을 익혀두는 것이 좋습니다.

바로 소스를 통해 알아보겠습니다.

예시 코드

import logging

# 로그 생성
logger = logging.getLogger()

# 로그의 출력 기준 설정
logger.setLevel(logging.INFO)

# log 출력 형식
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# log를 console에 출력
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(formatter)
logger.addHandler(stream_handler)

# log를 파일에 출력
file_handler = logging.FileHandler('my.log')
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)

for i in range(10):
	logger.info(f'{i}번째 방문입니다.')
  1. 우선 첫 번째 줄처럼 loggin.getLogger()를 통해 logger를 생성해 줍니다.

이때, 파라미터로 아무것도 넣어주지 않으면 root logger가 생성되고, 로거의 이름을 넣어주면 해당 이름으로 생성됩니다.

(임의의 이름으로 생성된 logger는 모두 root logger의 자손이 됩니다.)

  1. logger의 출력 기준을 설정해줍니다. (level, severity)

이벤트의 심각도는 DEBUG, INFO, WARNING, ERROR, CRITICAL순입니다.

심각도에 따라 설정된 level에 따라 그 이상의 level로 호출된 log만 기록이 남게 됩니다.

예를 들어, 기본 설정은 WARNING으로 되어있기 때문에 DEBUGINFO log들은 출력되지 않지만, WARNING, ERROR, CRITICAL log들을 출력이 됩니다.

원하는 기준 level(심각도)는 setLevel 함수로 설정해 줄 수 있습니다.

위처럼 logger.setLevel(logging.INFO)로 설정한 경우, INFO 이상에 대한 log를 출력으로 확인할 수 있습니다.

아래 표는 공식 문서에서 제공하는 적절한 사용 상황입니다.

수준사용할 때
DEBUG상세한 정보. 보통 문제를 진단할 때만 필요합니다.
INFO예상대로 작동하는지에 대한 확인.
WARNING예상치 못한 일이 발생했거나 가까운 미래에 발생할 문제(예를 들어 ‘디스크 공간 부족’)에 대한 표시. 소프트웨어는 여전히 예상대로 작동합니다.
ERROR더욱 심각한 문제로 인해, 소프트웨어가 일부 기능을 수행하지 못했습니다.
CRITICAL심각한 에러. 프로그램 자체가 계속 실행되지 않을 수 있음을 나타냅니다.

  1. formatter는 저장될 log의 포맷을 의미합니다. 이 포맷은 저장된 로그를 읽을 때 쉽게 파악할 수 있도록 구성됩니다.
%(asctime)s - %(name)s - %(levelname)s - %(message)s

위 코드에서 %(asctime)s는 로그가 기록된 시간을 의미하고, %(name)s는 로깅에 사용된 로거의 이름을 나타냅니다. %(levelname)s는 로그의 레벨을 나타내며, INFO, ERROR 등의 값으로 설정됩니다. 마지막으로 %(message)s는 로그에 기록된 메시지를 나타냅니다.

이러한 포맷은 로그 데이터를 분석하고 해석하는 데 중요한 역할을 합니다. 따라서 포맷을 명확하게 정의하는 것이 로깅 시스템을 구축하는 데 매우 중요합니다.

더 다양한 포맷은 아래 공식문서에서 확인할 수 있습니다. [링크]

  1. log를 출력할 handler를 지정해줍니다.

handler 객체는 log 메시지를 지정된 대상으로 전달하는 역할을 합니다.

stream_handler는 console에 log를 출력하기 위해 추가합니다. (print 처럼 콘솔에 출력됨)

file_handler는 log를 파일에 쓰는 것으로 원하는 파일명을 파라미터로 넣어주면 되겠습니다.

또한 위에서 선언한 formatter를 각각 적용해줍니다.

  1. log 출력

이제 반복문을 통해 10번의 log.info() 명령어를 호출하여 메시지를 출력해 보았는데요, 아래와 같이 console창에 출력도 되고, 또한 my.log라는 파일에도 잘 출력된 것을 확인할 수 있습니다.

출력 결과

참고문서

[1] python logging 공식 문서 [링크]


Uploaded by N2T

반응형
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday