[AITech][Product Serving] 20220526 - Logging

2 minute read


본 포스팅은 SOCAR의 ‘변성윤’ 마스터 님의 강의를 바탕으로 작성되었습니다.

Logging

Logging Basics

로그란?

머신러닝 인퍼런스 요청 로그, 인퍼런스 결과 등을 추후에 활용하기 위해 기록을 남겨놓는 것

데이터의 종류

  • 데이터베이스 데이터(서비스 로그, Database에 저장)
    • 서비스가 운영되기 위해 필요한 데이터
    • 예) 고객이 언제 가입했는지, 어떤 물건을 구입했는지 등
  • 사용자 행동 데이터(유저 행동 로그, 주로 Object Storage, Data warehouse에 저장)
    • 유저 로그라고 지칭하면 사용자 행동 데이터를 의미
    • 서비스에 반드시 필요한 내용은 아니지만, 더 좋은 제품을 만들기 위해 필요한 데이터
    • 앱이나 웹에서 유저가 어떤 행동을 하는지를 나타내는 데이터
    • UX와 관련해서 인터랙션이 이루어지는 관점에서 발생하는 데이터
      • 예) Click, View, 스와이프 등
  • 인프라 데이터(Metric)
    • 백엔드 웹 서버가 제대로 동작하고 있는지 확인하는 데이터
    • Request 수, Response 수
    • DB 부하 등

[조금 더 자세히]

  • Metric
    • 값을 측정할 때 사용
    • CPU, Memory 등
  • Log
    • 운영 관점에서 알아야 하는 데이터를 남길 때 사용
    • 함수가 호출되었다. 예외 처리가 되었다. 등
  • Trace
    • 개발 관점에서 알아야 하는 것
    • 예외 Trace

로그 활용 방식

  • 모델이 예측 결과가 올바른지 확인
  • 어떤 feature가 들어왔는지 확인
  • 시스템이 정상 작동하는지 확인

데이터 적재 방식

  • Database(RDB)에 저장하는 방식
    • 다시 웹, 앱 서비스에서 사용되는 경우 활용
    • 실제 서비스용 Database
  • Database(NoSQL)에 저장하는 방식
    • Elasticsearch, Logstash or Fluent, Kibana에서 활용하려는 경우
  • Object Storage에 저장하는 방식
    • S3, Cloud Storage에 파일 형태로 저장
    • csv, parquet, json 등
    • 별도로 Database나 Data warehouse에 옮기는 작업이 필요
  • Data Warehouse에 저장하는 방식
    • 데이터 분석 시 활용하는 데이터 웨어하우스로 바로 저장


Logging in Python

logging

logging: 파이썬 로깅 모듈

  • 웹 서버, 머신러닝, CLI 등 여러 파이썬 코드에서 사용할 수 있음
  • 심각도에 따라 info, debug, error, warning 등 다양한 카테고리로 데이터를 저장할 수 있음

image-20220530151002167

  • 기본 logging level은 WARNING
    • 따로 설정하지 않으면 WARNING 이상 레벨에 대해서만 로그를 보여줌

logging vs print

  • console에만 output을 출력하는 print
  • logging은 file, webscoket 등 파이썬이 다룰 수 있는 모든 포맷으로 output을 출력할 수 있음
    • 언제 어디서(파일 이름과 코드 상의 몇번째 줄인지) 해당 output이 발생했는지 알 수 있음
    • output을 심각도에 따라 분류할 수 있음
      • 예) Dev 환경에서는 debug 로그까지, Prod(운영) 환경에서는 info 로그만 보기 등
    • 다만 print보다 알아야 하는 지식이 존재

파이썬 logging 모듈

  • logging.getLogger()로 Logger 객체 생성
    • 따로 config 설정을 하지 않았기 때문에 아래 코드에서는 logging 출력 X

image-20220530151445483

  • Console에서 debug, info 등의 output을 확인하려면 logging config를 설정해야 함
    • 아래에서 지정한 포맷 ('%(asctime)s | %(levelname)s - %(message)s') 형태로 로그 출력

image-20220530151531522

Python Logging Component

  • Logger

    • 로그를 생성하는 method 제공 (logger.info() 등)
      • 로그 level과 logger에 적용된 filter를 기반으로 처리해야 하는 로그인지 판단
      • Handler에게 LogRecord 인스턴스 전달
    • logging.getLogger(name)으로 logger object 사용
      • name이 주어지면 해당 name의 logger 사용하고, name이 없으면 root logger 사용
      • 마침표로 구분되는 계층 구조
        • ex) logging.getLogger(‘foo.bar’) => logging.getLogger(‘foo’)의 자식 logger 반환
    • logging.setLevel(): Logger에서 사용할 level 지정
  • Handler

    • Logger에서 만들어진 log를 적절한 위치로 전송 (파일 저장 또는 console 출력 등)

    • level과 formatter를 설정하여 필터링할 수 있음

    • StreamHandler, FileHander, HTTPHandler 등

      image-20220530152638247

    • 코드 예시

      image-20220530152652944

  • Formatter

    • 최종적으로 Log에 출력될 Formatting 설정

    • 시간, Logger 이름, 심각도, Output, 함수 이름, Line 정보, 메시지 등 다양한 정보 제공

      image-20220530152731823


전체 logging flow

image-20220530152754137



참고 자료

Categories: ,

Updated:

Leave a comment