베오
DCode
베오
전체 방문자
오늘
어제
  • 분류 전체보기 (218)
    • 공지사항 (1)
    • 잡설 (1)
    • Programming (33)
      • [C] (1)
      • [Java] (4)
      • [Python] (2)
      • [Android] (2)
      • [Network] (0)
      • [Operation System] (2)
      • [Spring Boot] (22)
      • [Docker] (0)
    • Algorithm (31)
      • 자료구조 (2)
      • 알고리즘 (Java) (14)
      • 알고리즘 (기초) (15)
    • Coding Test (131)
      • BOJ (131)
      • Algospat (0)
    • 이론적인거 (14)
      • 보안 (5)
      • 오류 해결 (2)
      • 디자인 패턴 (5)
      • 네트워크 (1)
      • 기타 (1)
    • 최신기술 (4)
      • 블록체인 (1)
    • [Project] (1)

블로그 메뉴

  • 🐈‍⬛ GitHub
  • 📫 방명록
  • 🔖 태그

공지사항

인기 글

티스토리

hELLO · Designed By 정상우.
베오

DCode

Programming/[Python]

[Python] Logging 모듈을 사용해보자

2022. 8. 28. 20:45

아래 문서를 참조하여 작성하였습니다.

문서 링크

전체 코드는 다음 링크를 참조해주세요

전체 코드 링크

로깅이 뭔데?

코드를 작성하다보면, 현재 특정 변수의 값이 잘 들어갔는지 확인해보거나, 오류가 발생하면 오류에 관련된 메시지를 출력하는 작업을 의미한다.


그래서 왜 쓰는데?

Q : 그냥 print() 쓰면 되는거 아닌가?

A : 로깅을 사용하게 되면 로그의 중요도에 따라 필터링 하여 확인할 수 있으며, 콘솔 출력 뿐만 아니라 파일로도 저장하여 추후 조회가 가능하다.

Q : 나는 그냥 단순 출력만 쓰고 싶은데?

A : 단순 콘솔 출력을 위한 것이라면 print()가 해당 작업을 위한 최상의 도구가 될 수 있다.


로깅의 수준

로깅의 수준은 다음과 같이 5단계로 나뉜다.

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

기본 수준은 WARNING 이다.

기본 수준 이하는 따로 설정하지 않는 이상 이 수준 이상의 수준만 추적된다.


예시

로그를 콘솔에 출력하는 코드

import logging

logging.debug('This is DEBUG log')
logging.info('This is INFO log')
logging.warning('This is WARNING log')
logging.error('This is ERROR log')
logging.critical('This is CRITICAL log')

출력 결과

WARNING:root:This is WARNING log
ERROR:root:This is ERROR log
CRITICAL:root:This is CRITICAL log

기본 수준이 WARNING 이므로 이 이상 수준의 로그만 추적이 되는 것을 볼 수 있다.

DEBUG, INFO 도 출력하고싶다!

로그의 기본 수준을 변경해주면 DEBUG, INFO 둘 다 출력이 가능하다.

아래 코드는 기본 수준을 DEBUG 로 설정하여 출력하는 코드이다.

logging.basicConfig(level=logging.DEBUG)

logging.debug('This is DEBUG log')
logging.info('This is INFO log')
logging.warning('This is WARNING log')
logging.error('This is ERROR log')
logging.critical('This is CRITICAL log')

결과

DEBUG:root:This is DEBUG log
INFO:root:This is INFO log
WARNING:root:This is WARNING log
ERROR:root:This is ERROR log
CRITICAL:root:This is CRITICAL log

DEBUG, INFO 둘 다 잘 출력된 것을 확인할 수 있다.


파일에 로깅하기

logging에서 baseConfig를 수정함으로써 파일에 로깅이 가능하다.

logging.basicConfig(filename='example.log', level=logging.DEBUG)
logging.debug('파일에 저장될 DEBUG 수준 로깅')
logging.info('파일에 저장될 INFO 수준 로깅')
logging.warning('파일에 저장될 WARNING 수준 로깅')
logging.error('파일에 저장될 ERROR 수준 로깅')
logging.critical('파일에 저장될 CRITICAL 수준 로깅')

해당 python 파일이 있는 폴더에 example.log가 생긴다.

이를 확인해보자

DEBUG:root:파일에 저장될 DEBUG 수준 로깅
INFO:root:파일에 저장될 INFO 수준 로깅
WARNING:root:파일에 저장될 WARNING 수준 로깅
ERROR:root:파일에 저장될 ERROR 수준 로깅
CRITICAL:root:파일에 저장될 CRITICAL 수준 로깅

다음과 같이 DEBUG수준부터 로깅이 적용된 것을 볼 수 있다.


메시지 포맷 변경하기

나는 해당 로그가 출력된 시간하고, 어느 모듈의, 어느 메소드에서 출력된건지 알고싶어!

프로젝트 단위로 로그 출력 형식을 통일해야 할 때 포맷을 정리하면 간편하게 로깅을 할 수 있다.

Attribute Name Format Statement
asctime %(asctime)s LogRecord 가 생성된 시간
filename %(filename)s pathname의 파일명 부분
funcName %(funcName)s 로깅 호출을 포함하는 함수의 이름
message %(message)s 로그된 메시지
levelname %(levelname)s 메시지의 텍스트 로깅 수준 (’DEBUG’, ‘INFO’, “WARNING’, ‘ERROR’, ‘CRITICAL’)

출력된 시간, 로깅 수준, 파일명, 메소드, 메시지가 포멧팅된 로깅 코드이다.

def logging_formatting():
    logging.basicConfig(format=f'[%(asctime)s] [%(levelname)s] %(filename)s - %(funcName)s : %(message)s', level=logging.DEBUG)
    logging.debug('test')
    time.sleep(1)
    logging.debug('test')

출력 결과

[2022-08-28 20:40:27,904] [DEBUG] logging_dummy.py - logging_formatting : test
[2022-08-28 20:40:28,915] [DEBUG] logging_dummy.py - logging_formatting : test
저작자표시 (새창열림)

'Programming > [Python]' 카테고리의 다른 글

[Python] 단위 테스트를 해보자 UnitTest  (0) 2022.08.30
    'Programming/[Python]' 카테고리의 다른 글
    • [Python] 단위 테스트를 해보자 UnitTest
    베오
    베오

    티스토리툴바