로그 잘 보이게 출력하여 개발 시 편하게 하기

jomminii·2024년 12월 25일
1

easy-coding

목록 보기
2/3
post-thumbnail

'로컬에선 로그 좀 잘 보이게 출력하자'라고 생각하며 터미널에 출력되는 로그를 조금만 더 이쁘게 노출하려고 한 노력을 적어본다.

위의 터미널에 출력된 로그를 보자.
도무지 한 눈에 알아보기 어려운 로그다. 검은건 종이요 하얀건 글씨...

종종 이러한 로그들을 편하게 보기 위해서 온라인 json viewer 를 찾아가 복붙을 해서 보곤 했다.

그런데 이런 것도 하루 이틀이지, 매번 이렇게 보는것도 귀찮고, 귀찮다보니 잘 보이지도 않는 로그를 뚫어져라 보느라 그냥 흘러가는 시간이 아까웠다.

그래서 좀 더 편하게 볼 수 있는 방법이 없을까 찾다가 간편히 json 방식에 일부 포맷팅을 더해서 로그를 출력하는 방식을 발견하고 도입하기로 했다.

우리 서비스는 Python Fast API 로 만들어진 백엔드 서버이고, 로그 시스템은 loguru 를 사용하고 있다. loguru 가 제공하는 옵션 중에는 json 직렬화 옵션까지는 존재하나, 내가 원하는 것처럼 이쁘게 포매팅 하는 기능은 지원하지 않는 것 같았다.

그래서 따로 커스터마이징한 포매팅을 적용했다.

    logger.info(
        f'[Response] Status Code: {response.status_code} - '
        f'Process Time: {process_time} - '
        f'Body: {response_body}'
    )

현재 로그를 위와 같은 형식으로 남기고 있는데, 기존의 response_body는 단순 str 으로 변경된 형태였다.

그래서 처음 보여진 이미지처럼 일렬로 나열된 형태로 노출되고 있었다.

def format_body(body: bytes, path: str):
    """
    JSON 포맷으로 변환하는 함수
    """
    # 제외할 경로 리스트
    json_except_path = [
        r'.*/system/menu',
    ]

    if isinstance(body, bytes):
        body = body.decode()

    if isinstance(body, str):
        try:
            body = json.loads(body)
        except json.JSONDecodeError:
            pass

    return json.dumps(body, default=str, indent=4, ensure_ascii=False) \
        if constants.check_env(env='local') is True \
        and constants.JSON_LOG_FORMAT is True \
        and is_path_excluded(path, json_except_path) is False \
        else str(body)

그래서 이 데이터를 json.dumps 를 통해 내가 원하는 indent 가 적용된 출력 형태를 만들기 위해, 우선 파이썬 객체로 변환시킨 후(json.loads) 다시 json.dumps 로 변환해주었다.

그리고 나면 아래처럼 내가 원했던 아름다운 출력 형식이 노출되게 된다.

이 작업을 하면서 추가로 고려했던 것은,

우선 이 로그 출력 방식은 로컬에만 적용되어야 한다는 것이다. 변경된 포매팅 방식은 보기 좋게 만들기 위해 인위적으로 라인 수를 늘렸기 때문에, 출력량이 훨씬 많이 늘어나게 된다. 이렇게 되면 로직이 실행되는 시간도 길어질 뿐만 아니라, 로그가 쌓이는(본 시스템 같은 경우는 클라우드 워치) 곳에도 부하가 심해지게 된다.

때문에 로컬에서 개발을 할 때만 적용되게 하기 위해 constants.check_env(env='local') is True 조건을 두었다.

또한 위와 비슷한 이유로 터미널에 너무 길게 쌓이는 로그를 항상 보고 싶어하진 않을 것이다. 그래서 JSON_LOG_FORMAT 이라는 환경변수를 제공하여, 개발자가 임의로 변경하여 적용 여부를 선택할 수 있게 했다.

추가로 하나 더 고민했던 부분은 menu api 처럼 항상 불러오는 api 의 경우, 긴 로그를 굳이 보고 싶지 않을 수 있다. 그래서 굳이 보고 싶지 않은 api 들은 json_except_path 에 담아 대상에서 제외할 수 있도록 했다.

이제 끝이다. 조금 더 편한 개발 생활을 즐겨보자.

profile
고민은 격렬하게, 행동은 단순하게

0개의 댓글

관련 채용 정보