[AITech][Product Serving] 20220526 - Logging
본 포스팅은 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 등 다양한 카테고리로 데이터를 저장할 수 있음
- 기본 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
- Console에서 debug, info 등의 output을 확인하려면 logging config를 설정해야 함
- 아래에서 지정한 포맷
('%(asctime)s | %(levelname)s - %(message)s')
형태로 로그 출력
- 아래에서 지정한 포맷
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 지정
- 로그를 생성하는 method 제공 (
-
Handler
-
Logger에서 만들어진 log를 적절한 위치로 전송 (파일 저장 또는 console 출력 등)
-
level과 formatter를 설정하여 필터링할 수 있음
-
StreamHandler, FileHander, HTTPHandler 등
-
코드 예시
-
-
Formatter
-
최종적으로 Log에 출력될 Formatting 설정
-
시간, Logger 이름, 심각도, Output, 함수 이름, Line 정보, 메시지 등 다양한 정보 제공
-
전체 logging flow
Leave a comment