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}번째 방문입니다.')
- 우선 첫 번째 줄처럼 loggin.getLogger()를 통해 logger를 생성해 줍니다.
이때, 파라미터로 아무것도 넣어주지 않으면 root logger가 생성되고, 로거의 이름을 넣어주면 해당 이름으로 생성됩니다.
(임의의 이름으로 생성된 logger는 모두 root logger의 자손이 됩니다.)
- logger의 출력 기준을 설정해줍니다. (level, severity)
이벤트의 심각도는 DEBUG
, INFO
, WARNING
, ERROR
, CRITICAL
순입니다.
심각도에 따라 설정된 level에 따라 그 이상의 level로 호출된 log만 기록이 남게 됩니다.
예를 들어, 기본 설정은 WARNING
으로 되어있기 때문에 DEBUG
와 INFO
log들은 출력되지 않지만, WARNING
, ERROR
, CRITICAL
log들을 출력이 됩니다.
원하는 기준 level(심각도)는 setLevel
함수로 설정해 줄 수 있습니다.
위처럼 logger.setLevel(logging.INFO)로 설정한 경우, INFO
이상에 대한 log를 출력으로 확인할 수 있습니다.
아래 표는 공식 문서에서 제공하는 적절한 사용 상황입니다.
수준 | 사용할 때 |
---|---|
DEBUG | 상세한 정보. 보통 문제를 진단할 때만 필요합니다. |
INFO | 예상대로 작동하는지에 대한 확인. |
WARNING | 예상치 못한 일이 발생했거나 가까운 미래에 발생할 문제(예를 들어 ‘디스크 공간 부족’)에 대한 표시. 소프트웨어는 여전히 예상대로 작동합니다. |
ERROR | 더욱 심각한 문제로 인해, 소프트웨어가 일부 기능을 수행하지 못했습니다. |
CRITICAL | 심각한 에러. 프로그램 자체가 계속 실행되지 않을 수 있음을 나타냅니다. |
- formatter는 저장될 log의 포맷을 의미합니다. 이 포맷은 저장된 로그를 읽을 때 쉽게 파악할 수 있도록 구성됩니다.
%(asctime)s - %(name)s - %(levelname)s - %(message)s
위 코드에서 %(asctime)s
는 로그가 기록된 시간을 의미하고, %(name)s
는 로깅에 사용된 로거의 이름을 나타냅니다. %(levelname)s
는 로그의 레벨을 나타내며, INFO, ERROR 등의 값으로 설정됩니다. 마지막으로 %(message)s
는 로그에 기록된 메시지를 나타냅니다.
이러한 포맷은 로그 데이터를 분석하고 해석하는 데 중요한 역할을 합니다. 따라서 포맷을 명확하게 정의하는 것이 로깅 시스템을 구축하는 데 매우 중요합니다.
더 다양한 포맷은 아래 공식문서에서 확인할 수 있습니다. [링크]
- log를 출력할 handler를 지정해줍니다.
handler
객체는 log 메시지를 지정된 대상으로 전달하는 역할을 합니다.
stream_handler
는 console에 log를 출력하기 위해 추가합니다. (print 처럼 콘솔에 출력됨)
file_handler
는 log를 파일에 쓰는 것으로 원하는 파일명을 파라미터로 넣어주면 되겠습니다.
또한 위에서 선언한 formatter를 각각 적용해줍니다.
- log 출력
이제 반복문을 통해 10번의 log.info() 명령어를 호출하여 메시지를 출력해 보았는데요, 아래와 같이 console창에 출력도 되고, 또한 my.log라는 파일에도 잘 출력된 것을 확인할 수 있습니다.
출력 결과
참고문서
[1] python logging 공식 문서 [링크]
Uploaded by N2T