이 문서에는 로그 애널리틱스를 사용하도록 업그레이드된 로그 버킷에 저장된 로그 항목에 대한 샘플 쿼리가 포함되어 있습니다.
이러한 버킷에서는 Google Cloud 콘솔의 로그 애널리틱스 페이지에서 SQL 쿼리를 실행할 수 있습니다. 더 많은 샘플은 logging-analytics-samples
및 security-analytics
GitHub 저장소를 참조하세요.
이 문서에서는 SQL 또는 로그 항목을 라우팅하고 저장하는 방법에 대해 설명하지 않습니다. 이러한 주제에 대한 자세한 내용은 다음 단계 섹션을 참고하세요.
이 페이지의 예시에서는 로그 뷰를 쿼리합니다. 애널리틱스 뷰를 쿼리하려면 다음 경로 형식을 사용합니다.
`analytics_view.PROJECT_ID.LOCATION.ANALYTICS_VIEW_ID`
앞의 표현식에서 PROJECT_ID
는 프로젝트 ID이고 LOCATION
과 ANALYTICS_VIEW_ID
는 분석 보기의 위치와 이름입니다.
SQL 언어 지원
로그 애널리틱스 페이지에서 사용되는 쿼리는 몇 가지 예외를 제외하고 GoogleSQL 함수를 지원합니다.
로그 애널리틱스 페이지를 사용하여 실행된 SQL 쿼리에는 다음 SQL 명령어가 지원되지 않습니다.
- DDL 및 DML 명령어
- JavaScript 사용자 정의 함수
- BigQuery ML 함수
- SQL 변수
다음은 BigQuery Studio 및 Looker Studio 페이지를 사용하거나 bq 명령줄 도구를 사용하여 연결된 데이터 세트를 쿼리할 때만 지원됩니다.
- JavaScript 사용자 정의 함수
- BigQuery ML 함수
- SQL 변수
권장사항
쿼리의 기간을 설정하려면 기간 선택기를 사용하는 것이 좋습니다. 예를 들어 지난주의 데이터를 보려면 기간 선택기에서 지난 7일을 선택합니다. 또한 기간 선택기를 사용하여 시작 및 종료 시간을 지정하고, 둘러볼 시간을 지정하고, 시간대를 변경할 수 있습니다.
WHERE
절에 timestamp
필드를 포함하면 시간 범위 선택기 설정은 사용되지 않습니다. 다음 예는 타임스탬프로 필터링하는 방법을 보여줍니다.
-- Matches log entries whose timestamp is within the most recent 1 hour.
WHERE timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)
시간별로 필터링하는 방법에 대한 자세한 내용은 시간 함수 및 타임스탬프 함수를 참고하세요.
시작하기 전에
이 섹션에서는 로그 애널리틱스를 사용하려면 먼저 완료해야 하는 단계를 설명합니다.
로그 버킷 구성
로그 애널리틱스를 사용하도록 로그 버킷이 업그레이드되었는지 확인합니다.
-
Google Cloud 콘솔에서 로그 스토리지 페이지로 이동합니다.
검색창을 사용하여 이 페이지를 찾은 경우 부제목이 Logging인 결과를 선택합니다.
- 쿼리하려는 로그 뷰가 있는 로그 버킷마다 로그 애널리틱스 사용 가능 열에 열기가 표시되어 있는지 확인합니다. 업그레이드가 표시되면 업그레이드를 클릭하고 대화상자를 완료합니다.
IAM 역할 및 권한 구성
이 섹션에서는 로그 애널리틱스를 사용하는 데 필요한 IAM 역할이나 권한을 설명합니다.
-
로그 애널리틱스를 사용하고 로그 뷰를 쿼리하는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.
-
_Required
및_Default
로그 버킷을 쿼리하려는 경우: 로그 뷰어(roles/logging.viewer
) -
프로젝트의 모든 로그 뷰를 쿼리하려는 경우:
로그 뷰 접근자(
roles/logging.viewAccessor
)
프로젝트 수준에서 부여된 로그 뷰 액세스자 역할에 IAM 조건을 추가하거나 로그 뷰의 정책 파일에 IAM 바인딩을 추가하여 주 구성원을 특정 로그 뷰로 제한할 수 있습니다. 자세한 내용은 로그 뷰에 대한 액세스 제어를 참조하세요.
이는 로그 탐색기 페이지에서 로그 항목을 보는 데 필요한 권한과 같습니다. 사용자 정의 버킷에 대한 뷰를 쿼리하거나
_Default
로그 버킷의_AllLogs
뷰를 쿼리하는 데 필요한 추가 역할에 대한 자세한 내용은 Cloud Logging 역할을 참조하세요. -
-
분석 뷰를 쿼리하는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대한 Observability Analytics 사용자(
roles/observability.analyticsUser
) IAM 역할을 부여해 달라고 요청하세요.
이 페이지의 쿼리를 사용하는 방법
-
Google Cloud 콘솔에서 로그 분석 페이지로 이동합니다.
검색창을 사용하여 이 페이지를 찾은 경우 부제목이 Logging인 결과를 선택합니다.
쿼리 창에서 code SQL을 클릭한 다음 쿼리를 복사하여 SQL 쿼리 창에 붙여넣습니다.
쿼리를 복사하기 전에
FROM
절에서 다음 필드를 바꿉니다.- PROJECT_ID: 프로젝트 식별자
- LOCATION: 로그 뷰 또는 분석 뷰의 위치
- BUCKET_ID: 로그 버킷의 이름 또는 ID
- LOG_VIEW_ID: 로그 뷰의 식별자. 100자(영문 기준)로 제한되며 문자, 숫자, 밑줄, 하이픈만 포함할 수 있습니다.
다음은 로그 뷰의
FROM
절 형식을 보여줍니다.FROM `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
이 페이지의 로그 샘플은 로그 뷰를 쿼리합니다. 애널리틱스 뷰를 쿼리하려면 다음 경로 형식을 사용합니다.
`analytics_view.PROJECT_ID.LOCATION.ANALYTICS_VIEW_ID`
앞의 표현식에서PROJECT_ID
는 프로젝트 ID이고LOCATION
과ANALYTICS_VIEW_ID
는 분석 보기의 위치와 이름입니다.
BigQuery Studio 페이지에서 이 문서에 표시된 쿼리를 사용하거나 bq 명령줄 도구를 사용하려면 FROM
절을 수정하고 연결된 데이터 세트의 경로를 입력하세요.
예를 들어 myproject
프로젝트에 있는 연결된 데이터 세트 mydataset
의 _AllLogs
뷰를 쿼리하려면 경로는 myproject.mydataset._AllLogs
입니다.
일반 사용 사례
이 섹션에는 맞춤 쿼리를 만드는 데 도움이 될 수 있는 몇 가지 일반적인 사용 사례가 나열되어 있습니다.
기본 로그 버킷에 로그 항목 표시
_Default
버킷을 쿼리하려면 다음 쿼리를 실행합니다.
SELECT
timestamp, severity, resource.type, log_name, text_payload, proto_payload, json_payload
FROM
`PROJECT_ID.LOCATION._Default._AllLogs`
-- Limit to 1000 entries
LIMIT 1000
정규 표현식으로 필드 값 추출
정규 표현식을 사용하여 문자열에서 값을 추출하려면 REGEXP_EXTRACT
함수를 사용합니다.
SELECT
-- Display the timestamp, and the part of the name that begins with test.
timestamp, REGEXP_EXTRACT(JSON_VALUE(json_payload.jobName), r".*(test.*)$") AS name,
FROM
`PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
WHERE
-- Get the value of jobName, which is a subfield in a JSON structure.
JSON_VALUE(json_payload.jobName) IS NOT NULL
ORDER BY timestamp DESC
LIMIT 20
자세한 내용은 REGEXP_EXTRACT
문서를 참고하세요.
이전 쿼리와 같은 하위 문자열 일치의 경우 CONTAINS_SUBSTR
함수를 사용하면 쿼리가 더 효율적입니다.
로그 항목 필터링
쿼리에 필터를 적용하려면 WHERE
절을 추가합니다. 이 절에서 사용하는 구문은 필드의 데이터 유형에 따라 다릅니다. 이 섹션에서는 다양한 데이터 유형의 여러 예를 제공합니다.
페이로드 유형별 로그 항목 필터링
로그 항목에는 세 가지 페이로드 유형 중 하나가 있을 수 있습니다. 페이로드 유형별로 로그 항목을 필터링하려면 다음 절 중 하나를 사용하세요.
텍스트 페이로드
-- Matches log entries that have a text payload. WHERE text_payload IS NOT NULL
JSON 페이로드
-- Matches log entries that have a JSON payload. WHERE json_payload IS NOT NULL
Proto 페이로드
-- Matches log entries that have a proto payload. -- Because proto_payload has a data type of RECORD, this statement tests -- whether a mandatory subfield exits. WHERE proto_payload.type IS NOT NULL
쿼리 결과에서 json_payload
및 proto_payload
필드가 모두 JSON으로 렌더링되며, 이를 통해 탐색할 수 있습니다.
타임스탬프로 로그 데이터 필터링
타임스탬프로 로그 항목을 필터링하려면 기간 선택기를 사용하는 것이 좋습니다. 하지만 WHERE
절에서 timestamp
를 지정할 수도 있습니다.
-- Matches log entries whose timestamp is within the most recent hour
WHERE timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)
시간별로 필터링하는 방법에 대한 자세한 내용은 시간 함수 및 타임스탬프 함수를 참조하세요.
리소스별 필터링
리소스별로 로그 데이터를 필터링하려면 WHERE
절에 resource.type
문을 추가합니다.
-- Matches log entries whose resource type is gce_instance
WHERE resource.type = "gce_instance"
심각도별 필터링
심각도별로 로그 데이터를 필터링하려면 WHERE
절에 severity
문을 추가합니다.
-- Matches log entries whose severity is INFO or ERROR
WHERE severity IS NOT NULL AND severity IN ('INFO', 'ERROR')
정수인 severity_number
로 로그 항목을 필터링할 수도 있습니다. 예를 들어 다음 절은 심각도 수준이 최소 NOTICE
인 모든 로그 항목과 일치합니다.
-- Matches log entries whose severity level is at least NOTICE
WHERE severity_number IS NOT NULL AND severity_number > 200
열거된 값에 대한 자세한 내용은 LogSeverity
를 참조하세요.
로그 이름으로 필터링
로그 이름으로 로그 데이터를 필터링하려면 WHERE
절에 log_name
또는 log_id
문을 추가합니다.
로그 이름은 리소스 경로를 지정합니다.
-- Matches log entries that have the following log ID. WHERE log_name="projects/cloud-logs-test-project/logs/cloudaudit.googleapis.com%2Factivity"
로그 ID는 리소스 경로를 생략합니다.
-- Matches log entries that have the following log id. WHERE log_id = "cloudaudit.googleapis.com/data_access"
리소스 라벨별 로그 항목 필터링
리소스 라벨은 JSON 구조로 저장됩니다. JSON 구조 내 필드 값으로 필터링하려면 JSON_VALUE
함수를 사용합니다.
SELECT
timestamp, JSON_VALUE(resource.labels.zone) AS zone, json_payload, resource, labels
FROM
`PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
WHERE
-- Matches log entries whose resource type is gce_instance and whose zone is
-- us-central1-f. Because resource has data type JSON, you must use JSON_VALUE
-- to get the value for subfields, like zone.
resource.type = "gce_instance" AND
JSON_VALUE(resource.labels.zone) = "us-central1-f"
ORDER BY timestamp ASC
이전 쿼리는 로그 항목에 저장된 리소스 라벨 형식을 사용합니다. 다음은 리소스 필드의 예입니다.
{
type: "gce_instance"
labels: {
instance_id: "1234512345123451"
project_id: "my-project"
zone: "us-central1-f"
}
}
JSON 데이터를 검색하고 변환할 수 있는 모든 함수에 대한 자세한 내용은 JSON 함수를 참조하세요.
HTTP 요청으로 필터링
HTTP 요청 필드가 있는 로그 항목만 쿼리하려면 다음 절을 사용하세요.
-- Matches log entries that have a HTTP request_method field.
-- Don't compare http_request to NULL. This field has a data type of RECORD.
WHERE http_request.request_method IS NOT NULL
IN
문을 사용할 수도 있습니다.
-- Matches log entries whose HTTP request_method is GET or POST.
WHERE http_request.request_method IN ('GET', 'POST')
HTTP 상태로 필터링
HTTP 상태가 있는 로그 항목만 쿼리하려면 다음 절을 사용하세요.
-- Matches log entries that have an http_request.status field.
WHERE http_request.status IS NOT NULL
JSON 데이터 유형 내의 필드로 필터링
JSON 데이터 유형이 있는 필드의 하위 필드에 특정 값이 있는 경우에만 로그 항목을 쿼리하려면 JSON_VALUE
함수를 사용하여 값을 추출합니다.
-- Compare the value of the status field to NULL.
WHERE JSON_VALUE(json_payload.status) IS NOT NULL
이전 절은 다음 절과 미묘하게 다릅니다.
-- Compare the status field to NULL.
WHERE json_payload.status IS NOT NULL
첫 번째 절에서는 상태 필드의 값이 NULL
인지 테스트합니다. 두 번째 절에서는 상태 필드가 있는지 테스트합니다. 로그 뷰에 로그 항목이 두 개 포함되어 있다고 가정해 보겠습니다. 한 로그 항목의 경우 json_payload
필드의 형식은 다음과 같습니다.
{
status: {
measureTime: "1661517845"
}
}
다른 로그 항목의 경우 json_payload
필드의 구조가 다릅니다.
{
@type: "type.googleapis.com/google.cloud.scheduler.logging.AttemptFinished"
jobName: "projects/my-project/locations/us-central1/jobs/test1"
relativeUrl: "/food=cake"
status: "NOT_FOUND"
targetType: "APP_ENGINE_HTTP"
}
WHERE json_payload.status IS NOT NULL
절은 두 로그 항목과 모두 일치합니다.
하지만 WHERE JSON_VALUE(json_payload.status) IS NOT NULL
절은 두 번째 로그 항목만 일치합니다.
로그 항목 그룹화 및 집계
이 섹션에서는 이전 샘플을 기반으로 로그 항목을 그룹화하고 집계하는 방법을 보여줍니다. 그룹화를 지정하지 않고 집계를 지정하면 SQL에서 WHERE
절을 충족하는 모든 행을 하나의 그룹으로 처리하므로 하나의 결과가 출력됩니다.
모든 SELECT
표현식은 그룹 필드에 포함되거나 집계되어야 합니다.
타임스탬프별로 로그 항목 그룹화
타임스탬프별로 데이터를 그룹화하려면 타임스탬프를 HOUR
과 같이 지정된 단위로 자르는 TIMESTAMP_TRUNC
함수를 사용합니다.
SELECT
-- Truncate the timestamp by hour.
TIMESTAMP_TRUNC(timestamp, HOUR) AS hour,
JSON_VALUE(json_payload.status) AS status,
-- Count the number log entries in each group.
COUNT(*) AS count
FROM
`PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
WHERE
-- Matches log entries that have a status field whose value isn't NULL.
json_payload IS NOT NULL AND JSON_VALUE(json_payload.status) IS NOT NULL
GROUP BY
-- Group by hour and status
hour,status
ORDER BY hour ASC
자세한 내용은 TIMESTAMP_TRUNC
문서 및 날짜 시간 함수를 참고하세요.
리소스별로 로그 항목 그룹화
다음 쿼리는 리소스 유형별로 로그 항목을 그룹화한 다음 각 그룹의 로그 항목 수를 계산하는 방법을 보여줍니다.
SELECT
-- Count the number of log entries for each resource type
resource.type, COUNT(*) AS count
FROM
`PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
GROUP BY resource.type
LIMIT 100
심각도별로 로그 항목 그룹화
다음 쿼리는 심각도별로 로그 항목을 그룹화한 다음 각 그룹의 로그 항목 수를 계산하는 방법을 보여줍니다.
SELECT
-- Count the number of log entries for each severity.
severity, COUNT(*) AS count
FROM
`PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
WHERE
severity IS NOT NULL
GROUP BY severity
ORDER BY severity
LIMIT 100
log_id
별로 로그 항목 그룹화
다음 쿼리는 로그 ID별로 로그 항목을 그룹화한 다음 각 그룹의 로그 항목 수를 계산하는 방법을 보여줍니다.
SELECT
-- Count the number of log entries for each log ID.
log_id, COUNT(*) AS count
FROM
`PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
GROUP BY log_id
ORDER BY count DESC
LIMIT 100
URL별 HTTP 요청의 평균 지연 시간 계산
다음 쿼리는 HTTP 요청 URL과 위치별로 로그 항목을 그룹화한 다음 각 그룹의 로그 항목 수를 계산하는 방법을 보여줍니다.
SELECT
-- Compute the average latency for each group. Because the labels field has a
-- data type of JSON, use JSON_VALUE to get the value of checker_location.
JSON_VALUE(labels.checker_location) AS location,
AVG(http_request.latency.seconds) AS secs, http_request.request_url
FROM
`PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
WHERE
-- Matches log entries when the request_method field is GET.
http_request IS NOT NULL AND http_request.request_method IN ('GET')
GROUP BY
-- Group by request URL and location
http_request.request_url, location
ORDER BY location
LIMIT 100
서브네트워크 테스트를 위해 전송된 평균 바이트 계산
다음 쿼리는 리소스 라벨에 지정된 위치별로 로그 항목을 그룹화한 다음 각 그룹의 로그 항목 수를 계산하는 방법을 보여줍니다.
SELECT
-- Compute the average number of bytes sent per location. Because labels has
-- a data type of JSON, use JSON_VALUE to get the value of the location field.
-- bytes_sent is a string. Must cast to a FLOAT64 before computing average.
JSON_VALUE(resource.labels.location) AS location,
AVG(CAST(JSON_VALUE(json_payload.bytes_sent) AS FLOAT64)) AS bytes
FROM
`PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
WHERE
resource.type = "gce_subnetwork" AND json_payload IS NOT NULL
GROUP BY
-- Group by location
location
LIMIT 100
자세한 내용은 JSON 함수 및 변환 함수를 참고하세요.
패턴과 일치하는 필드로 로그 항목 수 계산
정규 표현식과 일치하는 하위 문자열을 반환하려면 REGEXP_EXTRACT
함수를 사용합니다.
SELECT
-- Extract the value that begins with test.
-- Count the number of log entries for each name.
REGEXP_EXTRACT(JSON_VALUE(json_payload.jobName), r".*(test.*)$") AS name,
COUNT(*) AS count
FROM
`PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID`
WHERE
json_payload.jobName IS NOT NULL
GROUP BY name
ORDER BY count
LIMIT 20
추가 예시는 REGEXP_EXTRACT
문서를 참조하세요.
교차 열 검색
이 섹션에서는 쿼리 중인 뷰의 여러 열을 검색하는 데 사용할 수 있는 두 가지 접근 방식을 설명합니다.
토큰 기반 검색: 검색 위치와 검색어를 지정한 다음
SEARCH
함수를 사용합니다.SEARCH
함수에는 데이터 검색 방식에 관한 구체적인 규칙이 있으므로SEARCH
문서를 읽어보시기 바랍니다.부분 문자열 기반 검색: 검색 위치와 문자열 리터럴을 제공한 다음
CONTAINS_SUBSTR
함수를 사용합니다. 시스템은 대소문자를 구분하지 않는 테스트를 실행하여 문자열 리터럴이 표현식에 있는지 확인합니다.CONTAINS_SUBSTR
함수는 문자열 리터럴이 있으면TRUE
를 반환하고 그렇지 않으면FALSE
를 반환합니다. 검색 값은STRING
리터럴이어야 하지만 리터럴NULL
은 아니어야 합니다.
로그 뷰의 토큰 기반 검색
다음 쿼리는 '35.193.12.15'와 정확히 일치하는 필드가 있는 행만 보관합니다.
SELECT
timestamp, log_id, proto_payload, severity, resource.type, resource, labels
FROM
`PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID` AS t
WHERE
-- Search data access audit logs for the IP address that matches 35.193.12.15.
-- The use of backticks prevents the string from being tokenized.
proto_payload IS NOT NULL AND
log_id = "cloudaudit.googleapis.com/data_access" AND
SEARCH(t,"`35.193.12.15`")
ORDER BY timestamp ASC
LIMIT 20
쿼리 문자열에서 백틱이 생략되면 SEARCH
문서에 정의된 규칙에 따라 쿼리 문자열이 분할됩니다.
예를 들어 다음 문장을 실행하면 쿼리 문자열이 '35', '193', '12', '15'의 네 개 토큰으로 분할됩니다.
SEARCH(t,"35.193.12.15")
이전 SEARCH
문은 단일 필드가 네 개의 토큰과 모두 일치할 때 행과 일치합니다. 토큰의 순서는 중요하지 않습니다.
쿼리에 여러 SEARCH
문을 포함할 수 있습니다. 예를 들어 이전 쿼리에서 로그 ID에 대한 필터를 다음과 같은 문으로 바꿀 수 있습니다.
SEARCH(t,"`cloudaudit.googleapis.com/data_access`")
이전 문은 로그 뷰의 로그 항목에 있는 모든 필드를 검색하는 반면 원래 문은 로그 항목의 log_id
필드만 검색합니다.
여러 필드에 대해 다중 검색을 수행하려면 개별 문자열을 공백으로 구분합니다. 예를 들어 다음 문은 필드에 'Hello World', 'happy', 'days'가 포함된 행과 일치합니다.
SEARCH(t,"`Hello World` happy days")
마지막으로 전체 표를 검색하는 대신 특정 필드를 검색할 수 있습니다. 예를 들어 다음 문은 text_payload
및 json_payload
이라는 이름의 열만 검색합니다.
SEARCH((text_payload, json_payload) ,"`35.222.132.245`")
SEARCH
함수의 매개변수가 처리되는 방법에 대한 자세한 내용은 BigQuery 참조 페이지 검색 함수를 참조하세요.
로그 뷰에 대한 하위 문자열 검색
예를 들어 다음 쿼리는 특정 기간에 타임스탬프가 있는 특정 IP 주소가 포함된 모든 데이터 액세스 감사 로그 항목을 가져옵니다. 마지막으로 쿼리는 결과를 정렬한 후 가장 오래된 결과 20개를 표시합니다.
SELECT
timestamp, log_id, proto_payload, severity, resource.type, resource, labels
FROM
`PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_ID` AS t
WHERE
-- Search data access audit logs for the IP address that matches 35.193.12.15.
-- CONTAINS_SUBSTR performs a contains-test.
proto_payload IS NOT NULL AND
log_id = "cloudaudit.googleapis.com/data_access" AND
CONTAINS_SUBSTR(t,"35.193.12.15")
ORDER BY timestamp ASC
LIMIT 20
여러 뷰 쿼리
쿼리 문은 테이블 또는 표현식을 한 개 이상 검색하고 계산된 결과 행을 반환합니다. 예를 들어 쿼리 문을 사용하여 다양한 방식으로 서로 다른 테이블 또는 데이터 세트에 대한 SELECT
문의 결과를 병합한 후 결합된 데이터에서 해당 열을 선택할 수 있습니다.
여러 뷰를 쿼리하는 경우 해당 뷰는 동일한 위치에 있어야 합니다. 예를 들어 두 뷰가 us-east1
위치에 있는 경우 하나의 쿼리로 두 뷰를 모두 쿼리할 수 있습니다. us
멀티 리전에 있는 두 뷰를 쿼리할 수도 있습니다. 하지만 뷰의 위치가 global
인 경우 해당 뷰는 모든 물리적 위치에 있을 수 있습니다. 따라서 위치가 global
인 두 뷰 간의 조인이 실패할 수 있습니다.
추적 ID로 두 로그 뷰 조인
두 테이블의 정보를 결합하려면 조인 연산자 중 하나를 사용합니다.
SELECT
-- Do an inner join on two tables by using the span ID and trace ID.
-- Don't join only by span ID, as this field isn't globally unique.
-- From the first view, show the timestamp, severity, and JSON payload.
-- From the second view, show the JSON payload.
a.timestamp, a.severity, a.json_payload, b.json_payload, a.span_id, a.trace
FROM `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_1` a
JOIN `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_2` b
ON
a.span_id = b.span_id AND
a.trace = b.trace
LIMIT 100
유니온 문을 사용하여 두 개의 로그 뷰 쿼리
두 개 이상의 SELECT
문의 결과를 결합하고 중복 행을 삭제하려면 UNION
연산자를 사용합니다. 중복 행을 유지하려면 UNION ALL
연산자를 사용합니다.
SELECT
timestamp, log_name, severity, json_payload, resource, labels
-- Create a union of two log views
FROM(
SELECT * FROM `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_1`
UNION ALL
SELECT * FROM `PROJECT_ID.LOCATION.BUCKET_ID.LOG_VIEW_2`
)
-- Sort the union by timestamp.
ORDER BY timestamp ASC
LIMIT 100
중복 로그 항목 삭제
로그 분석은 쿼리가 실행되기 전에 중복 로그 항목을 삭제하지 않습니다. 이 동작은 로그 이름, 타임스탬프, 삽입 ID 필드를 비교하여 중복 항목을 삭제하는 로그 탐색기를 사용하여 로그 항목을 쿼리할 때와 다릅니다.
행 수준 유효성 검사를 사용하면 중복 로그 항목을 삭제할 수 있습니다.
자세한 내용은 문제 해결: 로그 애널리틱스 결과에 중복된 로그 항목이 있음을 참조하세요.
다음 단계
로그 항목을 라우팅하고 저장하는 방법은 다음 문서를 참조하세요.
SQL 참고 문서는 다음 문서를 참조하세요.