본문 바로가기

프로그래밍/Python

[파이썬, Python] log 남기기 (logging, VSCode)

728x90

안녕하세요. 오늘은 logger를 만들어 보겠습니다.

logger는 파이썬에서 프로그램 만들어서 사용할 때 log를 남겨,

프로그램에 버그가 생겼을 때, 남겨진 log로 디버깅을 할 수 있는 유용한 방법입니다.

 

오늘은 logger를 생성하는 함수를 만들어 해당 함수를 불러옴으로써 logger를 생성하고 log를 남기는 방법을 공유하겠습니다.

 

결과 파일들

 

테스트 파일은 위 세 파일입니다.

output.log는 log를 남기는 파일

utils.py는 log를 가져오는 함수가 들어있는 파일

test.py는 log를 테스트하는 파일입니다.

 

utils.py -> test.py -> output.log 파일 순으로 보겠습니다.

 

1. logger 생성 함수

 

utils.py 파일에 아래와 같이 코드를 입력합니다.

import logging

def getLogger(logger_name):
    logger = logging.getLogger(logger_name)

    if len(logger.handlers) > 0:
        return logger

    logger.setLevel(logging.DEBUG)
    formatter = logging.Formatter('[%(levelname)s|%(name)s|%(filename)s:%(lineno)s] %(asctime)s > %(message)s')

    streamHandler = logging.StreamHandler()
    streamHandler.setFormatter(formatter)

    logger.addHandler(streamHandler)

    file_handler = logging.FileHandler('./output.log')
    file_handler.setFormatter(formatter)

    logger.addHandler(file_handler)

    return logger

코드를 조금 뜯어보겠습니다.

 

logger_name : 본인이 설정하는 logger 이름 (마음대로 문자를 넣으시면 됩니다.)

 

if len(logger.handlers) > 0 : 이전에 해당 logger_name으로 생성된 적이 있으면 그 logger를 그대로 반환합니다.

                                            중복으로 logger가 생성되는 것을 방지하기 위함입니다.

 

logger.setLevel(logging.DEBUG) : log의 level을 설정해주는 코드입니다.

                                                       DEBUG < INFO < WARNING < ERROR < CRITICAL입니다.

                                                       예를 들어 DEBUG로 설정 시 모든 종류의 log가 남고

                                                       INFO로 설정 시 DEBUG 로그는 남지 않게 됩니다.

 

formatter = logging.Formatter('...') : log의 형태를 결정해줍니다. 사용할 수 있는 포맷의 종류는 아래와 같습니다.

 

형식 내용 예시
%(asctime)s 날짜, 시간 2022-10-23 20:24:07,003
%(created)f 생성 시간 1666525752.700142
%(filename)s 파일명 test.py
%(funcName)s 함수명 <module>
%(levelname)s 로그레벨 DEBUG, INFO, WARNING, ERROR, CRITICAL
%(levelno)s line 넘버 5
%(module)s 모듈 이름 test
%(msecs)d 생성 시간 中 밀리세컨드 700
%(message)s 로그 메시지 (직접 적은 메시지 출력)
 %(name)s 로그 이름 test_logger
%(pathname)s 소스 경로 d:\python\logging\test.py
%(process)d 프로세스 ID 10712
%(processName)s 프로세스 이름 Mainprocess
%(thread)d Thread ID 27512
%(threadName)s Thread Name MainThread

포맷의 종류는 위와 같고, 간단한 logger 사용 시 쓰면 좋을 포맷을 파란색으로 표시하였습니다.

 

위 포맷의 종류를 골라 아래 예시처럼 사용하시면 됩니다.

logger format

file_handler = logging.FileHandler('./output.log')

log를 저장 할 파일 경로를 설정해주는 코드입니다.

 

위처럼 추가된 Handler는 addHandler로 logger에 추가해주면 됩니다.

 

로그를 생성하는 함수를 만들었으니 이제 이용해보겠습니다.

 

2. logging 테스트

 

import utils

logger = utils.getLogger('test_logger')

logger.info('log')
logger.debug('log')

logger = utils.getLogger('test_logger')
logger.info('log2')

 

앞에서 생성한 파일을 import한 후 test_logger의 이름으로 logger를 가져옵니다.

 

logger.info('log') 처럼 log를 남기기만 하면 됩니다. info, debug 는 log level 입니다.

 

두번째 utils.getLogger를 실행 시에는 이미 만들어진 logger가 있으므로 있는 logger를 리턴 후 사용하게 됩니다.

 

3. log 결과 확인

 

위 test.py 코드를 실행하면 아래와 같이 output.log 파일에 로그가 남고 콘솔창에도 같은 결과가 남게 됩니다.

 

logging 결과

프로그램 실행 시 문제가 생겼을 때, 위와 같이 로그를 확인하여 어디까지 실행됐는지, 어디서 문제가 발생하였는데 디버깅이 가능합니다.