부부의 코딩 성장 일기

Loguru - Python의 대표 Logging 라이브러리 본문

Python/Libraries

Loguru - Python의 대표 Logging 라이브러리

펩시_콜라 2024. 2. 25. 19:00

production 환경에 application을 배포하다보면, 예기치못한 에러가 등장하고, 

해당 에러가 정확히 어디서 발생했는지, 왜 문제가 일어났는지를 판단하는 것은 쉬운 일이 아니다. 

 

이에, logging하는 것은 필수적이고, 문제를 디버깅하는 작업이 쉬워지게 된다.

Python에 여러 logging libaray가 존재하는데, 그 중 가장 인기있는 loguru에 대해 정리해보려한다. 

 

왜 logging library가 필요할까?

사실 print() method를 통해서 쉽게 log를 기록할 수도 있다.

하지만, print()는 아래의 단점들을 가지고 있다. (결국 print()의 단점이기도 하지만 logging library의 장점이 되겠다.)

  • JSON과 같은 구조화된 형식이 아니기도 하고, 심각도 수준 또는 타임스탬프와 같은 필드가 없어서, 추가적인 맥락을 제공하기 어렵다.
  • 애플리케이션을 구성해서 모든 로그를 수집하고, 여러 대상으로 보내는 것이 어려울 수 있다.
  • 또한, 애플리케이션이 다른 개발자들에 의해 가져와 사용되는 라이브러리인 경우, 출력 메시지가 사용자의 표준 출력을 혼란스럽게 만들 수가 있다. 

Logoru

logging을 쉽게 해주는 대표적이고 인기있는 라이브러리다. 다양한 유용한 기능을 포함하고 있어서, configuration을 하는데 많은 시간을 투자할 필요가 없어진다. 장점이 크게 4가지가 있는데,

  • 구조화된 logging을 지원하고, 
  • 꽤나 print된 결과물이 이쁘며, 
  • 커스텀 할 수도 있고, 
  • parser() 메소드를 지원하는데, 이를 통해 log로 부터 우리가 필요한 정보만을 추출하는 것도 용이해진다. 

Logoru 사용법

터미널에서 pip install을 통해 쉽게 설치 가능하며, 

pip install loguru

 

아래의 python코드를 실행하게 되면, 

from loguru import logger

logger.trace("This is a trace message.")
logger.debug("This is a debug message")
logger.info("This is an info message.")
logger.success("This is a success message.")
logger.warning("This is a warning message.")
logger.error("This is an error message.")
logger.critical("This is a critical message.")

 

아래처럼 각 level에 따라 (debug, info, ...) 다른 색깔로 output을 보여준다.

 

우선 각 단계들에 대한 설명은 아래와 같다. 

  • TRACE(5): 프로그램의 논리 흐름에 대한 상세한 내용
  • DEBUG(10): 디버깅 중에 도움이 되는 정보입니다.
  • INFO(20): 애플리케이션이 기대한 대로 동작하고 있음을 확인하는 내용.
  • SUCCESS(25): 작업이 성공적으로 수행되었음을 나타냄.
  • WARNING(30): 앞으로 애플리케이션에 영향을 미칠 수 있는 문제를 나타냄
  • ERROR(40): 즉각적인 주의가 필요하지만 프로그램을 종료시키지는 않는 문제
  • CRITICAL(50): "메모리가 부족하다"와 같이 프로그램을 종료시킬 수 있는 심각한 문제

하지만 위 output을 보면, trace에 대한 log message가 누락된 것을 확인할 수 있는데,

이는 Loguru가 default로 Debug를 보여줘야 하는 최소 level로 설정하고 있기 때문이다. 이에 Trace단계에 대한 print가 무시된 것.

만약 TRACE단계부터 log를 보여주고 싶다면, 아래와 같이 설정을 하면 된다. 

from loguru import logger
import sys        # <!- add this line

logger.remove(0)             # <- add this line
logger.add(sys.stdout, level="TRACE")   # <- add this line

logger.trace("This is a trace message.")

 

이렇게 TRACE 단계까지 잘 출력이 됨을 확인할 수 있다. 

 

Logoru Custom하기 

다양한 format으로 print할 수 있도록 지원하는데,

아래처럼 formatting을 하면, 

from loguru import logger
import sys

logger.remove(0)
logger.add(sys.stderr, format="{level} : {time} : {message}: {process}")  # <-

logger.error("This is  an error message.")

이렇게 해당 형식에 맞게 print가 되는 것을 확인할 수 있다. 

 

아래처럼 add에 "app.log"를 넣게 되면, python파일을 실행했을 시,

app.log 파일이 생기고, 해당 파일에 로그들이 기록되는 것을 확인할 수 있다. 

from loguru import logger

logger.remove(0)
# modify the following line
logger.add("app.log", format="{level} : {time} : {message}: {process}")

logger.error("This is  an error message.")

 

이외의 다양한 기능들은 아래 공식 documentation을 확인할 수 있다.