Logging

홍찬우·2023년 7월 30일

Logging Basics

로그란?

  • 머신러닝 inference 요청 로그, 결과를 저장

데이터의 종류

  1. 데이터베이스 데이터

    • 서비스 운영을 위해 필요한 데이터
  2. 사용자 행동 데이터 (유저 행동 로그)

    • 데이터 웨어하우스에 저장

    • 데이터 분석시 필요한 데이터

    • 앱, 웹에서 유저가 어떤 행동을 하는지 나타내는 데이터

  3. 인프라 데이터 (Metric)

    • 백엔드 웹 서버가 제대로 동작하고 있는지 확인하는 데이터

    • Request, Response 수


데이터 적재 방식

  1. 데이터베이스 (RDB)에 저장하는 방식

    • 다시 웹, 앱 서비스에서 사용되는 경우 활용

    • 실제 서비스용 DB

    • 데이터 추출시 SQL 사용

    • e.g., MySQL, PostgreSQL

  2. 데이터베이스 (NoSQL)에 저장하는 방식

    • 스키마가 없거나 느슨한 스키마 적용

    • JSON 형태와 비슷

    • e.g, MongoDB, ElasticSearch

  3. Object Storage에 저장하는 방식

    • S3, Cloud Storage에 파일 형태로 저장

    • 어떤 형태의 파일이어도 저장 가능

    • 별도로 DB나 데이터 웨어하우스로 옮기는 작업 필요

  4. Data Warehouse에 저장하는 방식

    • 데이터 분석시 활용하는 데이터 웨어하우스로 바로 저장

    • RDBMS, NoSQL, Object Storage 등에 저장된 데이터를 한 곳으로 옮겨서 처리

    • e.g., AWS Redshift, GCP BigQuery


Logging in Python

Python Logging Module

  • 심각도에 따라 다양한 카테고리로 데이터 저장

  • Log Level

    LevelValueDescriptionAPI
    DEBUG10문제 해결에 필요한 자세한 정보 공유logging.debug()
    INFO20작업이 정상적으로 작동logging.info()
    WARNING30예상하지 못한 일이거나 발생 가능한 문제 / 작업은 정상 수행logging.warning()
    ERROR40프로그램이 함수를 실행할 수 없음logging.error()
    CRITICAL50프로그램이 동작할 수 없는 심각한 문제logging.critical()
    • 기본 로깅 레벨은 WARNING

    • 따로 설정하지 않으면 WARNING 이상의 심각한 로그만 보여줌


Logging Code

import logging
import logging.config

logger = logging.getLogger("example")  # root logger
logger.info("hello world")  # 아무런 로그도 출력되지 않습니다

logger_config = {
    "version": 1,  # required
    "disable_existing_loggers": True,  # 다른 Logger를 overriding 합니다
    "formatters": {
        "simple": {"format": "%(asctime)s | %(levelname)s - %(message)s"},
    },
    "handlers": {
        "console": {
            "level": "DEBUG",
            "class": "logging.StreamHandler",
            "formatter": "simple",
        }
    },
    "loggers": {"example": {"level": "INFO", "handlers": ["console"]}},
}

logging.config.dictConfig(logger_config)
logger_with_config = logging.getLogger("example")
logger_with_config.info("이제는 보이죠?")
  • logging.getLogger() Logger 객체 생성

  • Config를 설정하지 않으면, 아무런 Output도 출력하지 않음

  • logging config를 지정

    • 위 코드에선 로그 format을 지정해 줌 (formatters)

    • "loggers": {"example": {"level": "INFO", "handlers": ["console"]}}

      • INFO 레벨부터 output 출력

Python Logging Component

  1. Logger

    • 로그를 생성하는 method 제공

    • 로그 레벨과 logger에 적용된 필터 기반으로 처리해야 하는 로그인지 판단

    • Handler에게 LogRecord 인스턴스 전달

    • logging.getLogger(’foo.bar’)

      • logging.getLogger(’foo’) 의 자식 logger bar 반환
  2. Handler

    • Logger에서 만들어진 로그를 적절한 위치로 전송 (파일 저장, Console 출력)

    • Level과 Formatter를 각각 설정해서 필터링 가능

    • StreamHandler, FileHandler, HTTPHandler 등

  3. Formatter

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

    • 시간, logger 이름, 심각도, Output, 함수 이름 등 정보 제공


Online Serving Logging (BigQuery)

BigQuery

  • GCP의 데이터 웨어하우스

  • 데이터 분석을 위한 도구로 Apache Spark 대용으로 활용 가능

  • SQL 기반


BigQuery 데이터 구조







※ 모든 이미지 및 코드 출처는 네이버 커넥트재단 부스트캠프 AI Tech 5기입니다. ※

profile
AI-Kid

0개의 댓글