Cloud Functions에서 Python용 Cloud Logging을 저장하는 더 좋은 방법은 무엇인가요?

15123 단어 googlecloudpython
Python을 사용하여 Cloud Functions에서 Cloud Logging으로 로그를 저장하는 방법은 여러 가지가 있었기 때문에 간단한 방법으로 장점과 단점을 정리하려고 했습니다.

TL;DR




방법
1.표준 로거
2.구조화된 로깅
3.공식 로깅 핸들러
4.Cloud Logging API 직접 사용


추가 라이브러리 필요 없음


-
-

로그 심각도 허용
-




다른 필드를 추가할 수 있습니다
-

-


파이썬 3.7 허용

-




1. 표준 로깅 사용



이것은 가장 간단한 방법입니다. 표준 로거를 사용할 수 있지만 심각도를 지원하지 않습니다.

다음 코드는 Cloud Functions에서 표준 로거를 사용하는 예시입니다.

import logging

import flask

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

def main(request):
    print("PRINT message")
    logger.debug("DEBUG message")
    logger.info("INFO message")
    logger.warning("WARNING message")
    logger.error("ERROR message")
    logger.critical("CRITICAL message")
    logger.exception("EXCEPTION message")
    return flask.jsonify({'result': 'ok'})


다음은 Cloud Functions 콘솔의 실제 스크린샷입니다.
항목의 모든 심각도가 default 임을 알 수 있습니다.


2. 구조적 로깅 사용



로그 항목에 로그 수준 또는 기타 특정fields을 포함하려면 직렬화된 JSON의 한 줄 형태로 stdout 또는 stderr에 로그를 쓸 수 있습니다. 구조적 로깅 지원은 Python 3.8 이상에서 사용할 수 있습니다.

https://cloud.google.com/functions/docs/monitoring/logging#writing_structured_logs

다음 코드는 Cloud Functions에서 구조화된 로깅을 사용하는 예시입니다.

import logging

import flask

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

def main(request):
    print("PRINT message")
    logger.debug("DEBUG message")
    logger.info("INFO message")
    logger.warning("WARNING message")
    logger.error("ERROR message")
    logger.critical("CRITICAL message")
    logger.exception("EXCEPTION message")
    return flask.jsonify({'result': 'ok'})


다음은 Cloud Functions 콘솔의 실제 스크린샷입니다.
모든 심각도가 올바르게 반영되었음을 확인할 수 있습니다.



Python 3.7 런타임에서 시도했을 때 공식 문서에 설명된 대로 심각도가 아래에서 지원되지 않았습니다.


3. 공식 로깅 핸들러 사용



Python 로거가 있는 로깅 핸들러는 공식 라이브러리에서 제공합니다.

https://cloud.google.com/logging/docs/setup/python#configuring_the_logging_handler

다음 코드는 Cloud Functions의 로깅 핸들러를 사용하는 예시입니다. (제가 사용한 google-cloud-logging의 라이브러리 버전은 2.7.0이었습니다. )

import logging

import flask
import google.cloud.logging

client = google.cloud.logging.Client()
client.setup_logging()
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

def main(request):
    print("PRINT message")
    logger.debug("DEBUG message")
    logger.info("INFO message")
    logger.warning("WARNING message")
    logger.error("ERROR message")
    logger.critical("CRITICAL message")
    logger.exception("EXCEPTION message")
    return flask.jsonify({'result': 'ok'})


다음은 Cloud Functions 콘솔의 실제 스크린샷입니다.
모든 심각도가 올바르게 반영되었음을 확인할 수 있습니다.

Image description

4. Cloud Logging API 직접 사용



공식 문서에서는 Cloud Logging API 클라이언트를 사용하여 API를 직접 실행하는 방법도 설명합니다.

https://cloud.google.com/logging/docs/setup/python#use_the_cloud_client_library_directly

다음 코드는 Cloud Functions에서 호출 디렉토리를 사용하는 예시입니다. (제가 사용한 google-cloud-logging의 라이브러리 버전은 2.7.0이었습니다. )

import flask
from google.cloud import logging

logging_client = logging.Client()
log_name = "hello-logging-func4"
logger = logging_client.logger(log_name)

def main(request):
    print("PRINT message")
    logger.log_text("DEFAULT message", severity="DEFAULT")
    logger.log_text("DEBUG message", severity="DEBUG")
    logger.log_text("INFO message", severity="INFO")
    logger.log_text("NOTICE message", severity="NOTICE")
    logger.log_text("WARNING message", severity="WARNING")
    logger.log_text("ERROR message", severity="ERROR")
    logger.log_text("CRITICAL message", severity="CRITICAL")
    logger.log_text("ALERT message", severity="ALERT")
    logger.log_text("EMERGENCY message", severity="EMERGENCY")
    return flask.jsonify({'result': 'ok'})


다음은 Cloud Functions 콘솔의 실제 스크린샷이지만 모든 로그 항목을 볼 수는 없습니다.



Cloud Logging 콘솔에서 모든 로그 항목을 볼 수 있습니다.



결론



이번 포스트에서는 Cloud Functions에서 Python용 Cloud Logging을 저장하는 방법을 소개하고, 장점과 단점을 간단하게 정리했습니다.

로그 수준이 필요하지 않다면 Python Standard Logger(No.1) 사용을 권장합니다.

로그 레벨이 필요한 경우에는 쉽게 설정할 수 있으므로 공식 로깅 핸들러(No.3)를 사용하는 것이 좋습니다. 또는 매우 유연하기 때문에 구조적 로깅(No.2)을 사용하는 것이 좋습니다.

좋은 웹페이지 즐겨찾기