python

exception 발생할 때 stacktrace를 로그에 남기기

kimjy 2023. 7. 16. 14:37

일반 로그 뿐만 아니라 코드에서 exception이 발생할 때에도 로그를 남기고 싶을 때가 있다. 그럴 경우에는 아래 코드와 같이 남기면 된다.

import os
import sys
import logging
import traceback

from logging.handlers import SysLogHandler
from constants import LOG_LEVEL


logger = logging.getLogger()
logger.setLevel(LOG_LEVEL)

syslog = SysLogHandler(address=(HOST, PORT))
hostname = os.environ.get('HOSTNAME', "")

log_format = hostname + " %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s"
formatter = logging.Formatter(log_format)

syslog.setFormatter(formatter)
syslog.setLevel(LOG_LEVEL)

logger.addHandler(syslog)

def handle_exception(type, value, tb):
    logger.exception(value)
    logger.exception("\n".join(traceback.format_tb(tb)))

sys.excepthook = handle_exception

sys.excepthook을 통해 예상치 못한 익셉션이 발생했을 때에는 handle_exception 함수를 호출하게 된다. handle_exception에는 stack trace를 로깅 시스템에 로그를 쏴주기때문에 의도와 같이 동작시킬 수 있다.