[python] logging basic (logging level, log 남기는 법, log file로 저장)

gunny·2024년 4월 12일
0

Python

목록 보기
24/29

python logging

python에서 제공하는 logging

Log level

로그의 각 레벨과 설명을 간략하게 정리해보자면

  • DEBUG : 자세한 정보
  • INFO : 작업이 정상적으로 작동하고 있다는 확인 메시지
  • WARNING : 예상하지 못한 일이 발생하거나, 발생 가능한 문제점을 명시. 작업은 정상적으로 진행됨
  • ERROR : 프로그램이 함수를 실행하지 못 할 정도의 심각한 문제
  • CRITICAL : 프로그램이 동작할 수 없는 정도의 심각한 문제

이다.

  • python의 경우 logging 시스템의 레벨은 WARNING 으로 설정되어 있다. 특별한 설정을 하지 않을 경우 WARNING 레벨과 이보다 더 심각한 레벨의 로그만 처리된다.

logging 방법

위에 링크된 LOGGING 관련 doc에서의 가장 적합한 로깅 방법은 아래와 같다.

  • 일반적인 console 출력 -> print()
  • 프로그램 실행 중 발생하는 정상적인 이벤트 알림 -> logging.info()
    자세한 수준의 로그는 -> logging.debug()
  • 런타임 중 발생한 이벤트에 대한 경고 중 프로그램을 수정해 문제를 해결할 수 있을 경우 -> warning.warn()
    사용자가 처리할 수 없는 경우 -> logging.warning()
  • 런타임 중 발생한 이벤트와 관련한 에러 -> 예외 처리로 raise Exception
  • 발생한 예외를 suppress하고 raise 하지 않은 경우 -> logging.error(), logging.exception(), logging.critical()

Root Logger 이용해 log 생성

  • 가장 간단하게 로그를 생성하는 방법은 module-level로 정의된 root logger를 사용한다.
import logging

logging.warning('Warning message')
logging.info('Info message')

# output 
#WARNING:root:warning messages

위의 코드를 보면, warning 로그는 출력이 되지만 info 로그는 출력이 되지 않는데, root logger의 기본 level이 warning 수준이어, 해당 수준 이상의 로그만 처리되기 때문이다.
이러한 logger가 처리하는 로그의 레벨을 조정하는 방법은 아래와 같다.

  • basicConfig의 level 인자를 조절한다.
import logging

logging.basicConfig(level=logging.INFO)
logging.warning("warning messages")
logging.info("info message")

#output
#WARNING:root:warning messages
#INFO:root:info message

출력된 log의 formatting

출력되는 로그의 포맷팅은 아래와 같은 방법을 이용한다.

import logging

logging.basicConfig(
    format="%(asctime)s/%(levelname)s/%(message)s",
    datefmt="%m/%d/%Y %I:%M:%S %p",
    level=logging.DEBUG,
)


logging.debug("Formatting debug message")

# output
# 04/12/2024 03:04:19 PM/DEBUG/Formatting debug message

log 파일로 저장

콘솔로 출력하는 것 외에도 파일로 저장할 수 있는데,
baseConfigfilename 인자를 넣어준다.
이때 level 인자 또한 지정해주면, 해당 인자 수준의 이상의 로그가 파일로 저장된다.

import logging 

logging.basicConfig(filename="logging_test.log", level=logging.INFO)
logging.debug("debug message")
logging.warning("warning messages")
logging.info("info message")

위의 logging_test.log 파일은

WARNING:root:warning messages
INFO:root:info message

위와 같이 저장되어 있다.

이렇게 설정을 할 경우에는 콘솔에 로그 메시지가 출력되지 않는다.
basicConfig를 여러번 실행해도 가장 처음 호출된 설정만 유효하고, 나머지 설정이 적용되지 않는다.

-> Root logger에 이미 handler 가 설정되어 있다면, basicConfig는 아무런 처리도 하지 않는다.

여러 개의 handler를 등록하고 싶은 경우 handlers 인자로 전달하는 방법이 있지만 가장 처음의 설정만 유효하다는 점은 변함이 없기 때문에 하나의 logger에서 발생한 로그를 여러 handler가 처리하도록 설정하는 방법은 따로 있다.

이를 언급하기 전에 다음 장에서 로깅 시스템의 구성 요소들을 훑고가자.

참고 사이트

profile
꿈꾸는 것도 개발처럼 깊게

0개의 댓글