코드 몇 줄만으로 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 로그 가격 책정과 다를 수 있습니다.
마이그레이션을 시작하기 전에
앱이 포함된 프로젝트에서 Cloud Logging API를 사용 설정합니다.
앱에 로그를 작성할 권한이 있는지 확인합니다.
기본적으로 앱의 기본 서비스 계정에는 로그를 작성할 권한이 있습니다.
앱에서 다른 서비스 계정 또는 사용자 계정을 사용하거나 기본 서비스 계정의 권한을 변경한 경우 사용 중인 계정에 로그 작성 권한이 있는지 확인하세요.
마이그레이션 프로세스 개요
App Engine 로깅 대신 Cloud Logging을 사용하도록 Python 앱을 마이그레이션하려면 다음 안내를 따르세요.
Cloud Logging용 Cloud 클라이언트 라이브러리를 설치합니다.
Python 로깅 모듈에
AppEngineHandler
를 연결합니다.App Engine에 앱을 배포하고 로깅이 예상대로 작동하는지 확인합니다.
Cloud Logging용 Cloud 클라이언트 라이브러리 설치
App Engine에서 앱을 실행할 때 AppEngineHandler
를 앱에서 사용할 수 있도록 만들려면 다음 안내를 따르세요.
app.yaml
파일과 동일한 폴더에requirements.txt
파일을 만들고 다음 행을 추가합니다.google-cloud-logging==1.14.0
Python 2.7 앱을 지원하므로 Cloud Logging 클라이언트 라이브러리의 1.14.0 버전을 사용하는 것이 좋습니다.
앱의
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 오류가 표시됩니다.
디렉터리를 만들어
lib/
같은 타사 라이브러리를 저장합니다. 그런 다음pip install
을 사용하여 디렉터리에 라이브러리를 설치합니다. 예를 들면 다음과 같습니다.pip install -t lib -r requirements.txt
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
연결
로그 항목을 작성하는 각 파일에서 다음을 수행합니다.
- Cloud Logging 클라이언트 라이브러리를 가져옵니다.
- Cloud Logging 클라이언트를 인스턴스화합니다.
현재 환경에 적절한 Cloud Logging 핸들러를 검색합니다. App Engine에서 앱이 실행되면 Cloud Logging 클라이언트가
AppEngineHandler
를 검색합니다.AppEngineHandler
는 항목의 형식을 JSON 객체로 지정하고 심각도별 필터링과 앱 항목과 요청 로그 항목의 상관관계 파악을 지원하는 데 필요한 메타데이터를 제공합니다.Cloud Logging 클라이언트의
setup_logging()
메서드를 실행하여 기본 리스너를 Python 루트 로거의 로깅 핸들러로 연결합니다.
예를 들면 다음과 같습니다.
핸들러가 연결되면 애플리케이션에 표시되고 기본적으로 INFO
수준 이상인 모든 로그가 Logging으로 전송됩니다.
앱 배포
앱을 배포할 준비가 되었으면 다음을 수행해야 합니다.
-
업데이트를 테스트하고 심각도 수준이 할당되고 앱 항목이 요청 항목과 상관관계를 갖도록 하는 유일한 방법은 앱을 Python 3 런타임에 배포하는 것입니다.
Python 2 런타임에 업데이트를 배포하면 App Engine 로깅 서비스가 Python 루트 로거의 항목을 리슨하고 로그 탐색기에 맞게 형식을 지정합니다.
앱이 로컬에서 실행되는 경우 Cloud Logging은
AppEngineHandler
를 사용하지 않고 App Engine은 요청 항목을 작성할 수 없습니다. 로그 탐색기를 보고 심각도 수준이 앱 항목에 할당되었는지 확인합니다. 요청 항목을 펼쳐서 요청을 처리하는 동안 앱에서 작성한 항목이 요청 항목 아래에 중첩되어 표시되는지 확인합니다.
앱이 오류 없이 실행되면 트래픽 분할을 사용하여 업데이트된 앱의 트래픽을 천천히 늘립니다. 앱을 면밀히 모니터링하여 문제가 없는 것을 확인한 후 더 많은 트래픽을 업데이트된 앱으로 라우팅합니다.