에이전트가 배포된 후 에이전트에서 Cloud Logging을 사용하려면 다음 방법 중 하나를 사용하세요.
- stdout / stderr: 기본적으로 (추가 설정 없이) stdout 및 stderr에 작성된 로그는 각각 로그 ID
reasoning_engine_stdout
및reasoning_engine_stderr
로 라우팅됩니다. 단, 텍스트여야 합니다. - Python 로깅: 내장 Python 로거를 Cloud Logging과 통합할 수 있습니다. stdout 또는 stderr에 쓰는 것과 비교하여 구조화된 로그를 지원하며 최소한의 설정만 필요합니다.
- Cloud Logging 클라이언트: 사용자가 구조화된 로그를 작성할 수 있으며 로거를 완전히 제어할 수 있습니다 (예:
logName
및 리소스 유형 설정).
에이전트 로그 작성
에이전트의 로그를 작성할 때 다음을 확인합니다.
- severity: 예: 정보, 경고, 오류
- 페이로드: 로그의 콘텐츠 (예: 텍스트 또는 JSON)
- 추가 필드: 로그 간에 상관관계를 파악하기 위한 필드 (예: trace/span, 태그, 라벨)
예를 들어 에이전트를 개발할 때 각 쿼리의 입력을 로깅하려면 다음을 실행합니다.
stdout 또는 stderr
from typing import Dict
class MyAgent:
def set_up(self):
# No set up required. The logs from stdout and stderr are routed to
# `reasoning_engine_stdout` and `reasoning_engine_stderr` respectively.
pass
def query(self, input: Dict):
import sys
print(
f"input: {input}",
file=sys.stdout, # or sys.stderr
)
Python 로깅
from typing import Dict
class MyAgent:
def set_up(self):
import os
import google.cloud.logging
self.logging_client = google.cloud.logging.Client(project="PROJECT_ID")
self.logging_client.setup_logging(
name="LOG_ID", # the ID of the logName in Cloud Logging.
resource=google.cloud.logging.Resource(
type="aiplatform.googleapis.com/ReasoningEngine",
labels={
"location": "LOCATION",
"resource_container": "PROJECT_ID",
"reasoning_engine_id": os.environ.get("K_SERVICE", "").split("-")[-1],
},
),
)
def query(self, input: Dict):
import logging
import json
logging_extras = {
"labels": {"foo": "bar"},
"trace": "TRACE_ID",
}
logging.info( # or .warning(), .error()
json.dumps(input),
extra=logging_extras,
)
Cloud Logging 클라이언트
from typing import Dict
class MyAgent:
def set_up(self):
import os
import google.cloud.logging
self.logging_client = google.cloud.logging.Client(project="PROJECT_ID")
self.logger = self.logging_client.logger(
name="LOG_ID", # the ID of the logName in Cloud Logging.
resource=google.cloud.logging.Resource(
type="aiplatform.googleapis.com/ReasoningEngine",
labels={
"location": "LOCATION",
"resource_container": "PROJECT_ID",
"reasoning_engine_id": os.environ.get("K_SERVICE", "").split("-")[-1],
},
),
)
def query(self, input: Dict):
logging_extras = {
"labels": {"foo": "bar"},
"trace": "TRACE_ID",
}
self.logger.log_struct(
input,
severity="INFO", # or "DEBUG", "WARNING", "ERROR", "CRITICAL"
**logging_extras,
)
에이전트가 배포되고 쿼리되면 로그 항목이 생성됩니다. 예를 들어 다음 코드는
remote_agent = agent_engines.create(
MyAgent(),
requirements=["cloudpickle==3", "google-cloud-logging"],
)
remote_agent.query(input={"hello": "world"})
다음과 유사한 로그 항목이 생성됩니다.
stdout 또는 stderr
{
"insertId": "67a3bb3b000cc2df444361ab",
"textPayload": "input: {'hello': 'world'}",
"resource": {
"type": "aiplatform.googleapis.com/ReasoningEngine",
"labels": {
"location": "LOCATION",
"resource_container": "PROJECT_ID",
"reasoning_engine_id": "RESOURCE_ID"
}
},
"timestamp": "2025-02-05T19:25:47.836319Z",
"logName": "projects/PROJECT_ID/logs/aiplatform.googleapis.com%2Freasoning_engine_stdout", # or `*_stderr`
"receiveTimestamp": "2025-02-05T19:25:47.842550772Z"
}
Python 로깅
{
"insertId": "1ek9a2jfqh777z",
"jsonPayload": {"hello": "world"},
"resource": {
"type": "aiplatform.googleapis.com/ReasoningEngine",
"labels": {
"location": "LOCATION",
"resource_container": "PROJECT_ID",
"reasoning_engine_id": "RESOURCE_ID",
}
},
"timestamp": "2025-02-05T20:30:19.348067Z",
"severity": "INFO",
"labels": {
"foo": "bar",
"python_logger": "root",
},
"logName": "projects/PROJECT_ID/logs/LOG_ID",
"trace": "TRACE_ID",
"receiveTimestamp": "2025-01-30T21:38:50.776813191Z"
}
Cloud Logging 클라이언트
{
"insertId": "1ek9a2jfqh777z",
"jsonPayload": {"hello": "world"},
"resource": {
"type": "aiplatform.googleapis.com/ReasoningEngine",
"labels": {
"location": "LOCATION",
"resource_container": "PROJECT_ID",
"reasoning_engine_id": "RESOURCE_ID",
}
},
"timestamp": "2025-01-30T21:38:50.776813191Z",
"severity": "INFO",
"labels": {"foo": "bar"},
"logName": "projects/PROJECT_ID/logs/LOG_ID",
"trace": "TRACE_ID",
"receiveTimestamp": "2025-01-30T21:38:50.776813191Z"
}
상담사 로그 보기
로그 탐색기를 사용하여 로그 항목을 볼 수 있습니다.
Google Cloud 콘솔의 로그 탐색기로 이동합니다.
페이지 상단에서 Google Cloud 프로젝트 (
PROJECT_ID
에 해당)를 선택합니다.리소스 유형에서 Vertex AI Reasoning Engine을 선택합니다.
쿼리 빌드
로그 탐색기를 사용하여 점진적으로 쿼리를 빌드할 수 있습니다. 쿼리는 일반적으로 다음 고려사항을 기반으로 작성됩니다.
- 타임라인: 시간에 따라 관련 로그 항목을 검색합니다.
- 범위: 표준 속성을 기반으로 관련 로그 항목을 검색합니다.
- 리소스: 프로젝트의 다른 유형의 리소스와 구분합니다.
type
: 로그 탐색기에는 'Vertex AI 추론 엔진'으로, 로그 항목에는"aiplatform.googleapis.com/ReasoningEngine"
로 표시됩니다.labels
: 위치 (LOCATION
), 프로젝트PROJECT_ID
, 리소스RESOURCE_ID
- logName: 로그 항목이 속한 로그입니다.
- 빌드 시간의 로그 항목에는 로그 ID
reasoning_engine_build
가 있습니다. stdout
및stderr
의 로그 항목에는 각각 로그 IDreasoning_engine_stdout
및reasoning_engine_stderr
가 있습니다.- Python 로깅 또는 Cloud Logging 클라이언트의 로그 항목에는 에이전트의 로그 작성의 코드를 기반으로 하는 맞춤 로그 ID가 있습니다.
- 빌드 시간의 로그 항목에는 로그 ID
- trace 및 span: 쿼리 추적 시 로그에 사용합니다.
- severity: 로그 항목의 심각도입니다.
- insertId: 로그 항목의 고유 식별자입니다.
- 리소스: 프로젝트의 다른 유형의 리소스와 구분합니다.
- 라벨: 로그 항목에 관한 추가 정보를 제공하는 키-값 쌍 맵입니다. 라벨은 사용자 정의 또는 시스템 정의일 수 있으며 로그를 분류하고 로그 탐색기에서 더 쉽게 검색하는 데 유용합니다.
- payload: 로그 항목의 콘텐츠입니다.
다음은 RESOURCE_ID
가 있는 배포된 에이전트의 모든 INFO
로그에 대한 쿼리의 예입니다.
resource.labels.reasoning_engine_id=RESOURCE_ID AND
severity=INFO
로그 탐색기에서 다음 위치에서 확인할 수 있습니다.
https://console.cloud.google.com/logs/query;query=severity%3DINFO%0Aresource.labels.reasoning_engine_id%3D%22RESOURCE_ID%22;duration=DURATION?project=PROJECT_ID
여기서 쿼리는 적절하게 URL 인코딩되었으며 다른 매개변수는 다음과 같습니다.
DURATION
: 예를 들어 지난 30분 동안PT30M
(또는 지난 10분 동안PT10M
)PROJECT_ID
: Google Cloud 프로젝트입니다.
자세한 내용은 Logging 쿼리 언어를 사용하여 쿼리 빌드 및 저장을 참고하세요.
상담사의 로그 쿼리
로그를 쿼리하는 프로그래매틱 접근 방식에는 두 가지 일반적인 옵션이 있습니다.
- 구조화된 쿼리 언어 (SQL) 로그 애널리틱스를 사용하면 로그 보기 또는 분석 보기를 쿼리할 수 있습니다.
Python. 프로그래밍 언어 (이 경우 Python)의 클라이언트 라이브러리를 통해 Cloud Logging API를 호출합니다.
Python
from google.cloud import logging
logging_client = logging.Client(project="PROJECT_ID")
logger = logging_client.logger("LOG_ID") # E.g. "logging_client"
print("Listing entries for logger {}:".format(logger.name))
for entry in logger.list_entries(
filter_="resource.labels.reasoning_engine_id=RESOURCE_ID" # Optional
):
timestamp = entry.timestamp.isoformat()
print("* {}: {}".format(timestamp, entry.payload))
각 entry
는 LogEntry
에 해당합니다.
logger.list_entries
의 입력 인수에 관한 자세한 내용은 API 참조를 참고하세요.
SQL
SELECT *
FROM `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
SELECT *
FROM `analytics_view.PROJECT_ID.LOCATION.ANALYTICS_VIEW_ID`