Cloud Logging으로 마이그레이션

코드 몇 줄만으로 Cloud Logging을 사용할 수 있도록 앱을 업데이트하여 App Engine 로깅 서비스에서 사용할 수 있는 것과 거의 동일한 필터링 및 로그 상관관계 기능을 구현할 수 있습니다.

Cloud Logging으로 마이그레이션하려면 AppEngineHandler 로그 핸들러를 Python 로깅 모듈에 연결한 다음 Python 로깅 모듈을 사용하여 로그 항목을 작성합니다. Python 2 앱에서 이러한 업데이트를 수행하고 앱이 Python 2 또는 Python 3 런타임에서 실행될 때 동일한 로깅 동작을 확인할 수 있습니다.

App Engine 로깅과 Cloud Logging 간의 주요 차이점

  • App Engine 로깅을 사용하려면 Python 로깅 모듈을 사용하여 앱 로그 항목을 작성해야 합니다. Cloud Logging은 다음과 같은 접근방식을 모두 지원합니다.

    • (권장사항) 로깅 핸들러로 AppEngineHandler와 함께 Python 로깅 모듈을 사용합니다. 이 관용적 접근방식은 Cloud Logging 핸들러를 등록하는 데 몇 줄의 코드만 추가하면 되므로 앱을 다른 Python 환경에 더 쉽게 이식할 수 있습니다.

    • stdout 또는 stderr에 항목을 작성합니다. 이러한 항목은 로그 탐색기에 표시되지만 필터링 및 요청 로그와의 상관관계를 사용 설정하려면 항목의 형식을 JSON 객체로 지정하고 특정 메타데이터를 제공해야 합니다. 이 접근방식에 대한 자세한 내용은 구조화된 로깅을 참조하세요.

    • Cloud Logging 클라이언트 라이브러리를 직접 사용합니다. AppEngineHandler를 사용하는 경우 이 접근방식을 통해 Python 로깅 모듈을 사용하는 것과 동일한 결과를 얻을 수 있지만, 이 라이브러리에서 다른 로깅 프레임워크로 변경하면 코드를 대폭 업데이트해야 할 수 있습니다.

  • App Engine 로깅을 사용하면 로그 탐색기가 심각도 수준을 요청 로그에 할당합니다. 심각도 수준은 요청과 관련된 모든 앱 로그 항목의 가장 높은 심각도를 반영합니다. 예를 들어 요청으로 인해 앱에 경고 로그 항목이 표시되면 로그 탐색기에서 요청 로그 항목 옆에 경고 아이콘이 표시됩니다. 요청 항목을 펼치면 요청 항목 내에 중첩된 경고 로그 항목이 표시됩니다.

    Cloud Logging을 사용하면 로그 뷰어가 심각도 수준을 요청 로그에 할당하지 않습니다. 요청 항목을 펼치면 요청 항목 내에 중첩된 앱 항목이 표시됩니다. 해당 앱 항목에는 심각도 아이콘이 표시됩니다. 하지만 요청 항목 자체에는 심각도 아이콘이 표시되지 않으며 심각도 수준별로 필터링할 수 없습니다.

  • 할당량데이터 보관은 App Engine과 Cloud Logging에서 동일하지만 무료 로그 데이터 할당량을 초과하는 경우 Cloud Logging 가격 책정App Engine 로그 가격 책정과 다를 수 있습니다.

마이그레이션을 시작하기 전에

  1. 앱이 포함된 프로젝트에서 Cloud Logging API를 사용 설정합니다.

    API 사용 설정

  2. 앱에 로그를 작성할 권한이 있는지 확인합니다.

    기본적으로 앱의 기본 서비스 계정에는 로그를 작성할 권한이 있습니다.

    앱에서 다른 서비스 계정 또는 사용자 계정을 사용하거나 기본 서비스 계정의 권한을 변경한 경우 사용 중인 계정에 로그 작성 권한이 있는지 확인하세요.

마이그레이션 프로세스 개요

App Engine 로깅 대신 Cloud Logging을 사용하도록 Python 앱을 마이그레이션하려면 다음 안내를 따르세요.

  1. Cloud Logging용 Cloud 클라이언트 라이브러리를 설치합니다.

  2. Python 로깅 모듈에 AppEngineHandler연결합니다.

  3. App Engine에 앱을 배포하고 로깅이 예상대로 작동하는지 확인합니다.

Cloud Logging용 Cloud 클라이언트 라이브러리 설치

App Engine에서 앱을 실행할 때 AppEngineHandler를 앱에서 사용할 수 있도록 만들려면 다음 안내를 따르세요.

  1. app.yaml 파일과 동일한 폴더에 requirements.txt 파일을 만들고 다음 행을 추가합니다.

     google-cloud-logging==1.14.0
    

    Python 2.7 앱을 지원하므로 Cloud Logging 클라이언트 라이브러리의 1.14.0 버전을 사용하는 것이 좋습니다.

  2. 앱의 app.yaml 파일에서 libraries 섹션에 필수 Google RPC 및 setuptools 라이브러리와 선택적 SSL 라이브러리를 지정합니다.

    libraries:
    - name: grpcio
      version: 1.0.0
    - name: setuptools
      version: 36.6.0
    - name: ssl
      version: latest
    

    일부 클라이언트 라이브러리는 SSL 라이브러리가 필요하지 않습니다. 필요한 클라이언트 라이브러리의 SSL 라이브러리를 포함하지 않은 경우 앱에서 요청을 수신하면 로그 탐색기에 SSL 오류가 표시됩니다.

  3. 디렉터리를 만들어 lib/ 같은 타사 라이브러리를 저장합니다. 그런 다음 pip install을 사용하여 디렉터리에 라이브러리를 설치합니다. 예를 들면 다음과 같습니다.

      pip install -t lib -r requirements.txt
      

  4. app.yaml 파일과 동일한 폴더에 appengine_config.py 파일을 만듭니다. appengine_config.py 파일에 다음을 추가합니다.

    # appengine_config.py
    import pkg_resources
    from google.appengine.ext import vendor
    
    # Set path to your libraries folder.
    path = 'lib'
    # Add libraries installed in the path folder.
    vendor.add(path)
    # Add libraries to pkg_resources working set to find the distribution.
    pkg_resources.working_set.add_entry(path)
    

    앞의 예시의 appengine_config.py 파일은 lib 폴더가 현재 작업 디렉터리에 있다고 가정합니다. lib가 항상 현재 작업 디렉터리에 있다고 보장할 수 없으면 lib 폴더에 전체 경로를 지정합니다. 예를 들면 다음과 같습니다.

    import os
    path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lib')
    

로컬 개발의 경우 Python 2용 virtualenv와 같은 가상 환경에 종속 항목을 설치하는 것이 좋습니다.

Python 로깅 모듈에 AppEngineHandler 연결

로그 항목을 작성하는 각 파일에서 다음을 수행합니다.

  1. Cloud Logging 클라이언트 라이브러리를 가져옵니다.
  2. Cloud Logging 클라이언트를 인스턴스화합니다.
  3. 현재 환경에 적절한 Cloud Logging 핸들러를 검색합니다. App Engine에서 앱이 실행되면 Cloud Logging 클라이언트가 AppEngineHandler를 검색합니다.

    AppEngineHandler는 항목의 형식을 JSON 객체로 지정하고 심각도별 필터링과 앱 항목과 요청 로그 항목의 상관관계 파악을 지원하는 데 필요한 메타데이터를 제공합니다.

  4. Cloud Logging 클라이언트의 setup_logging() 메서드를 실행하여 기본 리스너를 Python 루트 로거의 로깅 핸들러로 연결합니다.

예를 들면 다음과 같습니다.

# Imports the Cloud Logging client library
import google.cloud.logging

# Instantiates a client
client = google.cloud.logging.Client()

# Retrieves a Cloud Logging handler based on the environment
# you're running in and integrates the handler with the
# Python logging module. By default this captures all logs
# at INFO level and higher
client.setup_logging()

핸들러가 연결되면 애플리케이션에 표시되고 기본적으로 INFO 수준 이상인 모든 로그가 Logging으로 전송됩니다.

# Imports Python standard library logging
import logging

# The data to log
text = "Hello, world!"

# Emits the data using the standard logging module
logging.warning(text)

앱 배포

앱을 배포할 준비가 되었으면 다음을 수행해야 합니다.

  1. App Engine에서 앱을 테스트합니다.

    업데이트를 테스트하고 심각도 수준이 할당되고 앱 항목이 요청 항목과 상관관계를 갖도록 하는 유일한 방법은 앱을 Python 3 런타임에 배포하는 것입니다.

    Python 2 런타임에 업데이트를 배포하면 App Engine 로깅 서비스가 Python 루트 로거의 항목을 리슨하고 로그 탐색기에 맞게 형식을 지정합니다.

    앱이 로컬에서 실행되는 경우 Cloud Logging은 AppEngineHandler를 사용하지 않고 App Engine은 요청 항목을 작성할 수 없습니다.

  2. 로그 탐색기를 보고 심각도 수준이 앱 항목에 할당되었는지 확인합니다. 요청 항목을 펼쳐서 요청을 처리하는 동안 앱에서 작성한 항목이 요청 항목 아래에 중첩되어 표시되는지 확인합니다.

  3. 앱이 오류 없이 실행되면 트래픽 분할을 사용하여 업데이트된 앱의 트래픽을 천천히 늘립니다. 앱을 면밀히 모니터링하여 문제가 없는 것을 확인한 후 더 많은 트래픽을 업데이트된 앱으로 라우팅합니다.