로깅 쿼리 언어

이 문서에서는 Cloud Logging 데이터를 쿼리하고 필터링하는 데 사용하는 Logging 쿼리 언어를 개략적으로 설명합니다.

Logging 쿼리 언어 설계에 대한 자세한 내용은 필터링을 위한 Google API 공식 사양을 참조하세요.

사용하려는 일반적인 쿼리의 예시는 로그 탐색기를 사용하는 샘플 쿼리를 참조하세요.

개요

Google Cloud 콘솔의 로그 탐색기, Logging API 또는 명령줄 인터페이스에서 Logging 쿼리 언어를 사용할 수 있습니다. Logging 쿼리 언어를 사용하여 데이터를 쿼리하고 필터를 작성해 싱크로그 기반 측정항목을 만들 수 있습니다.

쿼리는 Google Cloud 프로젝트 또는 폴더와 같이 선택한 Google Cloud 리소스에 있는 모든 로그 항목의 하위 집합을 지정하는 불리언 표현식입니다.

논리 연산자 ANDOR를 사용하여 LogEntry 색인이 생성된 필드를 기반으로 쿼리를 빌드할 수 있습니다. 다음 예시에서 resource.type 필드를 사용하면 Logging 쿼리 언어 문법이 다음과 같이 표시됩니다.

  • 간단한 제한: resource.type = "gae_app"

  • 논리곱 제한: resource.type = "gae_app" AND severity = "ERROR"

  • 논리합 제한: resource.type = "gae_app" OR resource.type = "gce_instance"

    • 다른 방법: resource.type = ("gae_app" OR "gce_instance")
  • 복잡한 논리곱/논리합 표현식: resource.type = "gae_app" AND (severity = "ERROR" OR "error")

다음은 쿼리의 예시입니다.

resource.type = "gce_instance" AND
severity >= "ERROR" AND
NOT textPayload:robot

이 쿼리는 Compute Engine의 로그 항목 중 심각도 값이 최소한 ERROR이고 textPayload 필드에 robot 문자열이 포함되지 않은 로그 항목에 대해 일치를 수행합니다. 문자열 비교는 대소문자를 구분하지 않습니다. resource, severity, textPayload 이름은 LogEntry 유형에 정의되어 있습니다.

구문 표기법

다음 섹션에서는 Logging 쿼리 언어 문법의 개요를 제공하고 쿼리가 구조화되는 방식과 일치가 수행되는 방법을 자세히 설명합니다. 일부 예시에서는 주석을 사용하여 설명 텍스트를 제공합니다.

다음에 유의하세요.

  • 쿼리 길이는 20,000자(영문 기준)를 초과할 수 없습니다.

  • Logging 쿼리 언어는 정규 표현식을 제외하고 대소문자를 구분하지 않습니다.

구문 요약

Logging 쿼리 언어 문법은 쿼리비교 측면에서 고려할 수 있습니다.

쿼리표현식이 포함된 문자열입니다.

expression = ["NOT"] comparison { ("AND" | "OR") ["NOT"] comparison }

비교는 단일 값 또는 불리언 표현식입니다.

"The cat in the hat"
resource.type = "gae_app"

첫 번째 줄은 단일 값인 비교의 예시입니다. 이러한 유형의 비교는 전역 제한입니다. has 연산자를 암시적으로 사용하여 로그 항목의 각 필드를 값과 비교합니다. 이 예시에서 LogEntry의 필드 또는 페이로드에 'The cat in the hat'이라는 문법이 있으면 비교가 성공한 것입니다.

두 번째 줄은 [FIELD_NAME] [OP] [VALUE] 형식의 불리언 표현식인 비교의 예입니다. 비교에는 세 가지 구성요소가 있습니다.

  • [FIELD_NAME]은 로그 항목의 필드입니다. 예를 들면 resource.type입니다.

  • [OP]는 비교 연산자입니다. 예를 들면 =입니다.

  • [VALUE]는 숫자, 문자열, 함수 또는 괄호로 묶은 표현식입니다. 예를 들면 "gae_app"입니다. JSON null 값의 경우 NULL_VALUE를 사용합니다.

부울 연산자

불리언 연산자 ANDOR단락 연산자입니다. NOT 연산자의 우선순위가 가장 높고 그 다음으로 ORAND의 순입니다. 예를 들어 다음 두 연산자는 서로 동일합니다.

"a" OR NOT "b" AND NOT "c" OR "d"
("a" OR (NOT "b")) AND ((NOT "c") OR "d")

비교 사이에 AND 연산자를 생략할 수 있습니다. NOT 연산자를 -(빼기) 연산자로 바꿀 수도 있습니다. 예를 들어 다음 두 쿼리는 동일합니다.

a="b" AND c="d" AND NOT e="f"
a="b" c="d" -e="f"

이 문서는 항상 ANDNOT을 사용합니다.

로그 뷰에서 사용하는 필터를 제외한 모든 필터에 AND, OR, NOT 연산자를 사용할 수 있습니다. 로그 뷰에서는 ANDNOT 작업만 지원합니다.

같은 표현식에서 ANDOR 규칙을 결합하려면 괄호를 사용하여 규칙을 중첩해야 합니다. 괄호를 사용하지 않으면 쿼리가 의도한 대로 작동하지 않을 수 있습니다.

불리언 연산자를 항상 대문자로 표기해야 합니다. 소문자 and, or, not은 검색어로 파싱됩니다.

비교

비교 형식은 다음과 같습니다.

[FIELD_NAME] [OP] [VALUE]

비교에는 세 가지 구성요소가 있습니다.

  • [FIELD_NAME]: 로그 항목 필드의 필드 경로 식별자입니다. 다음은 이러한 식별자의 예시입니다.

    resource.type
    resource.labels.zone
    resource.labels.project_id
    insertId
    jsonPayload.httpRequest.protocol
    labels."compute.googleapis.com/resource_id"
    

    필드 경로 식별자의 구성 요소에 특수 문자가 있는 경우 해당 구성 요소를 큰따옴표로 묶어야 합니다. 예를 들어 compute.googleapis.com/resource_id는 슬래시 /가 포함되어 있으므로 큰따옴표로 묶어야 합니다.

    자세한 내용은 이 문서의 필드 경로 식별자를 참조하세요.

  • [OP]: 비교 연산자이며 다음 중 하나입니다

    =           -- equal
    !=          -- not equal
    > < >= <=   -- numeric ordering
    :           -- "has" matches any substring in the log entry field
    =~          -- regular expression search for a pattern
    !~          -- regular expression search not for a pattern
    

정규 표현식을 사용하여 로그 항목을 검색하는 방법은 정규 표현식 사용을 참조하세요.

  • [VALUE]: 숫자, 문자열, 함수 또는 괄호로 묶은 표현식입니다. 문자열은 임의의 텍스트와 불리언, 열거형, 바이트 문자열 값을 나타내는 데 사용됩니다. [VALUE]는 비교하기 전에 필드 유형으로 변환됩니다. JSON null 값의 경우 NULL_VALUE를 사용합니다.

JSON null 값을 필터링하려면 다음 문법을 사용하세요.

jsonPayload.field = NULL_VALUE      -- includes "field" with null value
NOT jsonPayload.field = NULL_VALUE  -- excludes "field" with null value

[VALUE]가 여러 비교 값의 불리언 조합을 괄호로 묶은 형태인 경우 각 요소에 필드 이름과 비교 연산자가 적용됩니다. 예를 들면 다음과 같습니다.

jsonPayload.cat = ("longhair" OR "shorthair")
jsonPayload.animal : ("nice" AND "pet")

첫 번째 비교에서는 cat 필드 값이 'longhair' 또는 'shorthair'인지 확인합니다. 두 번째 비교에서는 animal 필드 값에 'nice'와 'pet' 단어가 순서에 관계없이 모두 포함되어 있는지 확인합니다.

필드 경로 식별자

모든 로그 항목은 LogEntry 유형의 인스턴스입니다. 비교의 왼쪽에 있는 식별자나 왼쪽의 시작 부분이 되는 식별자는 LogEntry 유형으로 정의된 필드여야 합니다. 사용 가능한 식별자와 그 값에 관한 자세한 내용은 LogEntry 유형을 참조하세요.

로그 항목 필드의 현재 목록은 다음과 같습니다. 각 필드 다음에는 그 필드의 다음 수준 이름이 따라옵니다(해당되는 경우).

  • httpRequest: { cacheFillBytes, cacheHit, cacheLookup, cacheValidatedWithOriginServer, latency, protocol, referer, remoteIp, requestMethod, requestSize, requestUrl, responseSize, serverIp, status, userAgent }
  • insertId
  • jsonPayload { 변수 }
  • labels { 변수 }
  • logName
  • metadata { systemLabels, userLabels }
  • operation{ id, producer, first, last }
  • protoPayload { @type, 변수 }
  • receiveTimestamp
  • resource { type, labels }
  • severity
  • sourceLocation: { file, line, function }
  • spanId
  • textPayload
  • timestamp
  • trace

비교에 사용할 수 있는 필드 경로 식별자의 예를 들면 다음과 같습니다.

  • resource.type: 첫 번째 경로 식별자가 resource이면 다음 식별자는 MonitoredResource 유형의 필드여야 합니다.

  • httpRequest.latency: 첫 번째 경로 식별자가 httpRequest이면 다음 식별자는 HttpRequest 유형의 필드여야 합니다.

  • labels.[KEY] 첫 번째 경로 식별자가 labels이면 다음 식별자인 [KEY]labels 필드에 표시되는 키-값 쌍의 키 중 하나여야 합니다.

  • logName: logName 드는 문자열이므로 다음에 어떠한 하위 필드 이름도 올 수 없습니다.

map 또는 struct 필드를 쿼리할 때는 표현식에서 키의 대소문자와 형식을 유지해야 합니다.

예를 들어 jsonPayload가 구조체 필드이면 jsonPayload.end_time과 같이 jsonPayload 내에 중첩되는 필드 이름이 jsonPayload.endTime과 다릅니다. 마찬가지로 labels과 같은 맵 필드의 경우 라벨 키 labels.env_namelabels.envName과 다릅니다. 반대로 일반적인 프로토콜 버퍼 필드 protoPayload를 쿼리할 때는 대소문자를 유지할 필요가 없습니다.

LogEntry 필드 유형에 대한 자세한 내용은 google.logging.v2 참조를 확인하세요.

특수문자

LogEntry 필드에 특수문자가 있으면 로그 필드를 따옴표로 묶어야 합니다. 예를 들면 다음과 같습니다.

jsonPayload.":name":apple

jsonPayload."foo.bar":apple

jsonPayload."\"foo\"":apple

특수문자 목록은 값 및 변환string 섹션을 참조하세요.

객체나 배열을 참조하는 필드 경로 식별자의 사용에 관한 자세한 내용은 이 문서의 객체 및 배열 유형을 참조하세요.

모니터링 리소스 유형

더 빠른 쿼리를 위해 모니터링 리소스 유형을 지정합니다. 리소스 유형 목록은 모니터링 리소스 유형을 참조하세요.

예를 들어 Compute Engine VM은 gce_instance 리소스 유형을, Amazon EC2 인스턴스는 aws_ec2_instance를 사용합니다. 다음 예시는 쿼리를 두 가지 유형의 VM으로 제한하는 방법을 보여줍니다.

resource.type = ("gce_instance" OR "aws_ec2_instance")

로그의 모니터링 리소스 유형 값에는 색인이 생성됩니다. 여기에 하위 문자열 일치를 사용하면 쿼리의 실행 속도가 더 늦어집니다.

누락 필드

쿼리에서 사용된 필드가 로그 항목에 표시되지 않으면 필드가 누락되었거나, 정의되지 않았거나, 기본값이 적용된 경우입니다.

  • 필드가 로그 항목의 페이로드(jsonPayload 또는 protoPayload)의 일부이거나 로그 항목 labels 섹션의 라벨에 있으면 필드가 누락됩니다. 누락된 필드를 사용하면 오류가 표시되지 않지만, 누락된 필드를 사용한 모든 비교는 자동으로 실패합니다.

    예: jsonPayload.nearest_store, protoPayload.name.nickname

  • 필드가 LogEntry 유형으로 정의되면 이 필드에 기본값이 적용됩니다. 필드가 존재하고 기본값이 있는 경우처럼 비교가 수행됩니다.

    예: httpRequest.remoteIp, trace, operation.producer

  • 그렇지 않으면 필드가 정의되지 않은 경우로, 쿼리를 사용하기 전에 오류로 감지됩니다.

    예: thud, operation.thud, textPayload.thud

필드의 특정 값을 테스트하지 않고 누락된 필드나 기본값이 적용된 필드가 있는지 테스트하려면 :* 비교를 사용하세요. 예를 들어 로그 항목에 operation.id 필드가 명시적으로 있으면 다음 비교는 성공합니다.

operation.id:*

다음 쿼리의 동작을 확인합니다.

  • 누락된 필드에서 불리언 NOT 연산자를 사용하면 결과는 TRUE입니다.

    -- Returns TRUE
    NOT missingField=foo
    
  • 누락된 필드에 같지 않음 비교 연산자 !=를 사용하면 결과는 FALSE입니다.

    -- Returns FALSE
    missingField!=foo
    

객체 및 배열 유형

각 로그 항목 필드는 스칼라, 객체 또는 배열을 저장할 수 있습니다.

  • 스칼라 필드는 174.4 또는 -1과 같은 단일 값을 저장합니다. string도 스칼라로 간주됩니다. DurationTimestamp와 같이 문자열로(또는 문자열에서) 변환될 수 있는 필드도 스칼라 유형입니다.

  • 객체 유형은 다음 JSON 값과 같이 이름이 지정된 값의 모음을 저장합니다.

    {"age": 24, "height": 67}
    

    객체 내부의 값을 참조할 수 있습니다. 예를 들어 jsonPayload.x에 앞의 값이 포함되어 있으면 jsonPayload.x.age의 값이 24가 됩니다.

  • 배열 필드는 동일한 유형의 값 목록을 저장합니다. 예를 들어 측정 값을 포함하는 필드에 숫자 배열이 있을 수 있습니다.

    {8.5, 9, 6}
    

    비교가 수행될 때 [FIELD_NAME]이 배열 필드인 경우 배열의 각 구성원이 [VALUE]와 비교되고 그 결과가 OR 연산자를 사용하여 하나로 결합됩니다. 예를 들어 jsonPayload.shoeSize{8.5, 9, 6}을 저장하는 배열 필드이면 비교는 다음과 같습니다.

    jsonPayload.shoeSize < 7
    

    이 값은 다음과 동일합니다.

    8.5 < 7 OR 9 < 7 OR 6 < 7
    

    이 예에서 전체 비교는 성공한 것으로 평가됩니다.

값과 변환

비교를 평가하는 첫 번째 단계는 오른쪽 값을 로그 항목 필드의 유형으로 변환하는 것입니다. 비교 시 스칼라 필드 유형과 값이 DurationTimestamp로 표현되는 다른 두 가지 유형을 함께 사용할 수 있습니다. 스칼라 유형 목록은 스칼라 프로토콜 버퍼 유형 목록을 참조하세요. 다음 표에는 로그 필드 유형으로 변환할 수 있는 값이 나와 있습니다.

필드 유형 허용되는 쿼리 값
bool

대소문자에 관계없이 모든 'true' 또는 'false'. 예: 'True', 'true'

bytes

모든 시퀀스의 바이트를 포함하는 문자열. 예: '\377\377'.

Duration

부호가 있고 단위 'ns', 'us', 'ms', 's', 'm', 'h' 중 하나가 뒤에 오는 10진수가 포함된 문자열. Durations(기간)는 나노초 단위까지 표시됩니다. 예: '3.2초'

enum

열거형 유형 리터럴의 이름으로 대소문자를 구분하지 않음. 예: '경고'(LogSeverity 유형의 값)

double

부호와 지수 부분이 있거나 없는 숫자 또는 특수값 문자열 'NaN', '-Infinity', 'Infinity'(대문자 또는 아님). 예: '-3.2e-8', 'nan'.

intNN

유형의 크기를 초과하지 않고 부호가 있는 정수. 예: '-3'.

string

UTF-8 인코딩 텍스트 또는 7비트 ASCII 텍스트를 포함하는 문자열. 삽입된 따옴표는 백슬래시로 이스케이프 처리합니다.

문자열 값을 큰따옴표로 묶어 다음 특수문자를 이스케이프 처리해야 합니다.

  • +(더하기), -(빼기) 또는 .(마침표)로 시작하는 문자열

  • ~(물결 표시), =(등호), ()(괄호), :(콜론), >(초과), <(미만), ,(쉼표), .(마침표), 또는 *(별표)가 있는 문자열

  • 이스케이프 시퀀스(예: \t)

Timestamp

RFC 3339 또는 ISO 8601 형식 문자열. 예: '2014-10-02T15:01:23.045Z'(RFC 3339), '2014-10-02'(ISO 8601) 쿼리 표현식에서 RFC 3339 형식의 타임스탬프는 'Z' 또는 ±hh:mm으로 시간대를 지정할 수 있습니다. 타임스탬프는 나노초 단위까지 표시됩니다.

uintNN

유형의 크기를 초과하지 않고 부호가 없는 정수. 예: '1234'.

변환을 시도했는데 실패할 경우 비교가 실패합니다.

변환에 문자열이 필요한 경우, 공백이나 연산자 같은 특수 문자가 포함되어 있지 않으면 숫자나 따옴표 없는 텍스트를 사용할 수도 있습니다. 마찬가지로, 변환 시 숫자가 필요한 경우 숫자가 포함된 문자열을 사용할 수 있습니다.

intNN 유형과 uintNN 유형은 int32uint64와 같이 다양한 크기의 정수 유형을 표현합니다. 64비트 정수 유형으로 변환될 값을 작성할 경우 이 값을 '9223372036854775807'과 같은 문자열로 작성합니다.

로그 필드 유형

로그 항목 필드의 유형이 결정되는 방식은 다음과 같습니다.

  • LogEntry 유형과 구성요소 유형에서 정의된 로그 필드는 프로토콜 버퍼 필드입니다. 프로토콜 버퍼 필드는 명시적 유형입니다.

  • protoPayload 객체의 일부인 로그 필드도 프로토콜 버퍼 필드이고 명시적 유형입니다. 프로토콜 버퍼 유형의 이름은 protoPayload"@type"에 저장됩니다. 자세한 내용은 JSON 매핑을 참조하세요.

    Any 메시지 유형과 연결된 필드를 필터링하면 value 필드가 자동으로 순회됩니다. 따라서 쿼리에 포함하지 마세요. 자세한 내용은 문제 해결을 참조하세요.

  • jsonPayload 내부의 로그 필드 유형은 로그 항목이 수신될 때 필드의 값에서 유추됩니다.

    • 따옴표로 묶이지 않은 숫자를 값으로 가지는 필드는 double 유형입니다.
    • true 또는 false 값을 가지는 필드는 bool 유형입니다.
    • 문자열을 값으로 가지는 필드는 string 유형입니다.

    긴 정수(64비트)는 double 값으로 정확하게 표현될 수 없기 때문에 문자열 필드에 저장됩니다.

  • Duration 유형과 Timestamp 유형은 프로토콜 버퍼 필드에서만 인식됩니다. 그 외의 경우에는 문자열 필드에 값이 저장됩니다.

주석

주석은 대시 두 개(--)로 시작하며 대시 다음의 모든 텍스트는 줄이 끝날 때까지 무시됩니다. 주석을 필터의 시작 부분, 용어 사이, 필터 끝에 배치할 수 있습니다.

다음과 같은 경우에 주석을 사용할 수 있습니다.

  • 절의 역할에 대한 정보로 복잡한 필터에 주석을 추가하려면 다음 명령어를 실행합니다.

     -- All of our target users are emitted by Compute Engine instances.
     resource.type = "gce_instance"
     -- Looking for logs from "alex".
     jsonPayload.targetUser = "alex"

  • 주석 프리픽스를 추가하거나 삭제하여 절을 빠르게 사용 설정 또는 중지하려면 다음 명령어를 실행합니다.

     resource.type = "gce_instance"
     -- jsonPayload.targetUser = "alex"
     jsonPayload.targetUser = "kiran"
     -- jsonPayload.targetUser = "sasha"

비교 연산자

등호 연산자(=, !=)와 부등 연산자(<, <=, >, >=)의 의미는 왼쪽 필드 이름의 기본 유형에 따라 결정됩니다.

  • 모든 숫자 유형: 숫자에 대한 일반적인 등호와 부등을 의미합니다.
  • bool: 등호는 불리언 값이 동일함을 의미합니다. 부등은 true>false로 정의됩니다.
  • enum: 등호는 열거형 값이 동일함을 의미합니다. 부등은 열거형 리터럴의 기본 숫자 값을 사용합니다.
  • Duration: 등호는 기간이 동일함을 의미합니다. 부등은 기간의 길이에 따라 결정됩니다. 예: 기간 "1s">"999ms"
  • Timestamp: 등호는 동일한 순간을 의미합니다. abTimestamp 값이면 a < ba가 시간순으로 b보다 먼저임을 의미합니다.
  • bytes: 피연산자는 바이트별로 왼쪽에서 오른쪽으로 비교됩니다.
  • string: 비교 시 대소문자를 구분하지 않습니다. 특히 먼저 피연산자 두 개 모두가 NFKC_CF 유니코드 정규화를 사용하여 정규화된 후 사전식 비교를 사용합니다. 그러나 정규 표현식 검색은 정규화되지 않습니다. 정규 표현식을 사용하여 로그 항목을 검색하는 방법에 대한 자세한 내용은 정규 표현식 사용을 참조하세요.

하위 문자열 연산자(:)는 stringbytes에 적용될 수 있으며 오른쪽 피연산자가 왼쪽 필드의 일부분과 같으면 된다는 점을 제외하고 등호처럼 처리됩니다. 색인이 지정된 필드의 하위 문자열 일치는 로그 색인을 사용하지 않습니다.

전역 제한

하나의 값으로 구성된 비교를 전역 제한이라고 합니다. Logging은 has(:) 연산자를 사용하여 로그 항목의 필드 또는 페이로드에 전역 제한이 포함되어 있는지 확인합니다. 일치하면 비교가 성공합니다.

전역 제한으로 작성된 가장 간단한 쿼리는 단일 값입니다.

"The Cat in The Hat"

ANDOR 연산자로 전역 제한을 결합하여 보다 정교한 쿼리를 만들 수 있습니다. 예를 들어 cat이 포함된 필드와 hat 또는 bat이 포함된 필드가 있는 모든 로그 항목을 표시하려면 쿼리를 다음과 같이 작성합니다.

("cat" AND ("hat" OR "bat"))

이 경우 cat, hat, bat라는 세 가지 전역 제한이 있습니다. 이러한 전역 제한은 개별적으로 적용되며 그 결과는 표현식이 괄호 없이 작성된 것처럼 하나로 결합됩니다.

전역 제한은 로그에서 특정 값을 쿼리하는 한 가지 방법입니다. 예를 들어 활동 로그에서 GCE_OPERATION_DONE이 포함된 항목을 찾으려면 다음 쿼리를 사용하면 됩니다.

logName = "projects/my-project-id/logs/compute.googleapis.com%2Factivity_log" AND
"GCE_OPERATION_DONE"

속도가 느릴 수 있는 전역 제한을 사용하는 대신 기본 제공 SEARCH 함수를 사용하여 색인된 필드를 쿼리하는 것이 좋습니다. 자세한 내용은 이 문서의 로그 항목 빨리 찾기를 참조하세요.

함수

쿼리에서 기본 제공 함수를 전역 제한으로 사용할 수 있습니다.

function = identifier ( [ argument { , argument } ] )

여기서 argument는 값, 필드 이름 또는 괄호로 묶은 표현식입니다. 함수에 관해서는 다음 섹션에서 설명합니다.

log_id

log_id 함수는 logName 필드에서 지정된 [LOG_ID] 인수와 일치하는 로그 항목을 반환합니다.

log_id([LOG_ID])

예를 들어 다음 쿼리는 cloudaudit.googleapis.com%2Factivity [LOG_ID]가 있는 모든 로그 항목을 반환합니다.

log_id("cloudaudit.googleapis.com/activity")

cast

cast 함수에는 형변환을 수행할 LogEntry 필드와 필드가 전환되는 데이터 유형의 두 가지 매개변수가 사용됩니다.

cast([FIELD], [TYPE][, OPTION])

이전 표현식의 매개변수는 다음과 같이 정의됩니다.

  • [FIELD]: logName 또는 jsonPayload.a_field와 같은 로그 항목의 필드 이름입니다.

  • [TYPE]: STRING, INT64, FLOAT64, BOOL과 같은 데이터 유형입니다.

    • TIMESTAMP 또는 DURATION: 일부 데이터 유형은 TIMESTAMP 데이터 유형에 대한 IANA 시간대 데이터베이스 시간대 지정과 같은 추가 옵션을 제공합니다.

예를 들어 다음 쿼리는 timestamp 필드를 STRING으로 형변환하고 America/New_York 시간대를 지정합니다.

cast(timestamp, STRING, TIMEZONE("America/New_York")) =~ "^2023-01-02.*"

regexp_extract

regexp_extract 함수를 사용하여 정규 표현식과 일치하는 첫 번째 하위 문자열을 찾습니다.

REGEXP_EXTRACT([FIELD], [REGULAR_EXPRESSION])

앞의 표현식에서 필드는 다음과 같이 정의됩니다.

  • [FIELD]: logName 또는 jsonPayload.a_field와 같은 로그 항목의 필드 이름입니다.
  • [REGULAR_EXPRESSION]: 캡처 그룹((...))을 하나 포함해야 하는 RE2 정규 표현식입니다. 정규 표현식에 추가 그룹화가 필요한 경우 비캡처 그룹 (?:...)를 사용해야 합니다. 캡처 그룹이 여러 개 있거나 캡처 그룹이 없으면 오류가 발생합니다.

castregexp_extract 함수를 연결할 수 있습니다.

CAST(REGEXP_EXTRACT(CAST(timestamp, STRING), "\\d+:\\d+:\\d+\\.(\\d+)"), INT64) < 500

이전 예시는 timestamp 필드를 문자열로 형변환합니다. 정규 표현식은 timestamp 문자열의 밀리초 부분을 캡처하고 이를 정수로 형변환해서 숫자 비교를 수행합니다. 밀리초 필드가 500보다 작은 타임스탬프를 포함하는 모든 로그 항목이 반환됩니다.

source

source 함수는 조직, 폴더, Google Cloud 프로젝트 계층 구조의 특정 리소스에 있는 로그 항목에 대해 일치를 수행합니다.

source 함수는 하위 리소스에 대해 일치를 수행하지 않습니다. 예를 들어 source(folders/folder_123)를 사용하면 folder_123 리소스의 로그에 일치를 수행하지만, folder_123 내의 Google Cloud 프로젝트 리소스의 로그에는 일치를 수행하지 않습니다.

특정 리소스 수준에서 로그를 쿼리하려면 다음 문법을 사용합니다.

source(RESOURCE_TYPE/RESOURCE_ID)
리소스 쿼리 예시
조직 source(organizations/ORGANIZATION_ID)
폴더 source(folders/FOLDER_ID)
Google Cloud 프로젝트 source(projects/PROJECT_ID)

샘플

sample 함수는 총 로그 항목 개수의 일정 비율을 선택합니다.

sample([FIELD], [FRACTION])

[FIELD]는 로그 항목에 있는 필드의 이름입니다(예: logName 또는 jsonPayload.a_field). 필드 값에 따라 샘플에 로그 항목이 있는지 여부가 결정됩니다. 필드 유형은 문자열 또는 숫자 값이어야 합니다. 각 로그 항목마다 필드의 값이 다르므로 [FIELD]insertId로 설정하는 것이 좋습니다.

[FRACTION][FIELD]에 포함할 값이 있는 로그 항목의 비율로, 0.0보다 크고 1.0보다 크지 않은 숫자입니다. 예를 들어 0.01을 지정하면 샘플에 [FIELD]에 대한 값을 가진 모든 로그 항목의 약 1%가 포함됩니다. [FRACTION]이 1이면 [FIELD]에 값이 있는 모든 로그 항목이 선택됩니다.

: 다음 쿼리는 syslog 로그에서 로그 항목의 25%를 반환합니다.

logName = "projects/my-project/logs/syslog" AND sample(insertId, 0.25)

세부정보: 해싱을 기반으로 하는 결정적 알고리즘은 로그 항목이 샘플에 포함되는지 또는 샘플에서 제외되는지 여부를 확인하는 데 사용됩니다. 생성된 샘플의 정확도는 해시된 값의 분포에 따라 달라집니다. 해시된 값이 일정하게 분포되지 않으면 생성된 샘플이 왜곡될 수 있습니다. 최악의 경우 [FIELD]에 항상 동일한 값이 포함되면 샘플에 모든 로그 항목의 [FRACTION]이 포함되거나 로그 항목이 아예 포함되지 않습니다.

[FIELD]가 로그 항목에 나타나면 다음과 같이 처리됩니다.

  • 값의 해시가 계산됩니다.
  • 해시된 값(숫자)가 가능한 최대 해시 값으로 나뉩니다.
  • 그 비율이 [FRACTION]보다 작거나 같으면 로그 항목이 샘플에 포함됩니다. 그렇지 않으면 샘플에서 제외됩니다.

[FIELD]가 로그 항목에 나타나지 않으면 다음과 같이 처리됩니다.

  • [FIELD]가 로그 항목의 페이로드 또는 labels 섹션의 일부이면 [FRACTION]이 1이어도 로그 항목이 샘플에 선택되지 않습니다.
  • 그렇지 않으면 로그 항목은 [FIELD]가 로그 항목에 있고 [FIELD] 값이 기본값인 것처럼 처리됩니다. 기본값은 LogEntry 유형에 따라 결정됩니다. 누락된 필드와 기본값이 적용된 필드에 관한 자세한 내용은 이 문서의 누락 필드를 참조하세요.

기본값이 적용된 필드가 있는 로그 항목을 샘플에서 제외하려면 필드-존재 연산자 :*을 사용하세요. 다음 쿼리는 field에 값을 명시적으로 제공한 로그 항목의 1% 샘플을 생성합니다.

field:* AND sample(field, 0.01)

ip_in_net

ip_in_net 함수는 로그 항목의 IP 주소가 서브넷에 포함되는지 여부를 판단합니다. 이 함수를 사용하면 요청이 내부 소스에서 전송되었는지 또는 외부 소스에서 전송되었는지 알 수 있습니다. 예를 들면 다음과 같습니다.

ip_in_net([FIELD], [SUBNET])

[FIELD]는 IP 주소나 범위를 포함하는 로그 항목의 문자열 값 필드입니다. 이 필드는 반복될 수 있으며, 이 경우 반복된 필드 중 하나에만 서브넷에 포함된 주소나 범위가 지정됩니다.

[SUBNET]은 IP 주소 또는 범위의 문자열 상수입니다. 이 섹션의 뒷부분에 설명된 대로 [SUBNET]이 유효한 IP 주소 또는 범위가 아니면 오류가 발생합니다.

: 다음 쿼리는 my_log 로그에서 로그 항목의 페이로드에 있는 IP 주소를 테스트합니다.

logName = "projects/my_project/logs/my_log" AND
ip_in_net(jsonPayload.realClientIP, "10.1.2.0/24")

세부정보: 로그 항목에서 [FIELD]가 누락되거나, 기본값이 적용되거나, 유효한 IP 주소 또는 범위가 포함되지 않으면 함수는 false를 반환합니다. 누락된 필드와 기본값이 적용된 필드에 관한 자세한 내용은 이 문서의 누락 필드를 참조하세요.

지원되는 IP 주소 및 범위의 예시는 다음과 같습니다.

  • IPv4: 10.1.2.3
  • IPv4 서브넷: 10.1.2.0/24
  • CIDR IPv6: 1234:5678:90ab:cdef:1234:5678:90ab:cdef
  • CIDR IPv6 서브넷: 1:2::/48

SEARCH 함수

기본 제공 SEARCH 함수를 사용하여 로그 데이터에서 문자열을 찾을 수 있습니다.

SEARCH([query])
SEARCH([field], [query])

SEARCH 함수 형식 모두 query 인수를 포함하며 문자열 리터럴 형식이어야 합니다. 첫 번째 형식에서는 전체 로그 항목이 검색됩니다. 두 번째 형식에서는 검색할 로그 항목의 필드를 지정합니다.

query 필드를 지정해야 합니다. 이 필드를 지정하지 않으면 오류가 반환됩니다.

SEARCH 함수가 처리되면 토큰을 토큰으로 분할하는 텍스트 분석기에 의해 query 문자열이 처리됩니다. Cloud Logging은 백틱으로 래핑된 토큰에 대해서도 항상 대소문자를 구분하지 않고 비교를 수행합니다. 이 동작은 백틱으로 래핑된 토큰의 대소문자를 보존하는 BigQuery의 동작과 다릅니다. 분석기 규칙에 대한 정보는 BigQuery 문서 텍스트 분석기 규칙을 참조하세요.

검색을 구성할 때 다음 사항을 고려하세요.

  • 토큰은 대소문자를 구분하지 않습니다. 다음 함수는 동일한 결과를 생성합니다:

    SEARCH("world")
    SEARCH("World")
    

    이전 함수는 단일 필드에 "world" 토큰이 포함된 경우 로그 항목에 일치를 수행합니다. SEARCH는 하위 문자열 일치가 아니라 일치검색을 수행하기 때문에 이전 함수는 값이 'worldwide'인 필드에는 일치를 수행하지 않습니다.

  • 검색할 필드를 지정하지 않으면 로그 항목에 모든 토큰이 포함된 경우 SEARCH 함수는 로그 항목에 일치를 수행합니다. 그러나 토큰의 순서는 중요하지 않으며 로그 항목의 동일한 필드에서 토큰이 발견될 필요가 없습니다.

    다음 함수는 동일한 결과를 생성하며, "hello" 및 "world" 토큰이 포함된 로그 항목에 일치를 수행합니다.

    SEARCH("hello world")
    SEARCH("World hello")
    
  • 검색할 필드를 지정하면 SEARCH 함수는 해당 필드만 검색합니다. 해당 필드에 모든 토큰이 포함되어 있으면 일치를 수행하지만 토큰의 순서는 중요하지 않습니다.

    다음 함수는 textPayload 필드에 "hello" 및 "world" 토큰이 포함된 경우에만 일치하는 항목을 생성합니다.

    SEARCH(textPayload, "hello world")
    
  • 문구에서 대소문자를 구분하지 않지만 일치검색을 적용하려면 문구를 백틱으로 묶습니다. 예를 들어 다음 함수는 'hello world' 문자열에 일치를 수행합니다.

    SEARCH("`hello world`")
    SEARCH("`Hello World`")
    SEARCH("`HELLO WORLD`")
    

    다음 함수에서는 백틱이 사용되므로 다른 결과가 생성됩니다.

    SEARCH("`hello world`")
    SEARCH("`world hello`")
    

Logging 쿼리 언어는 로그 데이터를 검색할 수 있는 다양한 방법을 지원합니다. 문자열을 검색할 때는 전역 검색이나 하위 문자열 검색을 수행하는 것보다 SEARCH 함수를 사용하는 것이 더 효율적입니다. 그러나 SEARCH 함수를 사용하여 텍스트가 아닌 필드에 일치를 수행할 수는 없습니다. 검색 작업 수행에 대한 지침은 전역 및 하위 문자열 최소화를 참조하세요.

시간으로 검색

인터페이스에서 로그 항목을 표시할 날짜와 시간에 특정 제한을 설정할 수 있습니다. 예를 들어 다음 조건을 쿼리에 추가하면 미리보기에는 지정된 30분 동안에만 로그 항목이 표시되고 이 기간을 벗어나게 스크롤할 수 없습니다.

timestamp >= "2016-11-29T23:00:00Z"
timestamp <= "2016-11-29T23:30:00Z"

타임스탬프 쿼리를 작성할 경우 날짜와 시간을 위와 같은 형식으로 사용해야 합니다.

timestamp 단축키를 사용하여 로그 항목을 검색할 수도 있습니다. 예를 들어 비교 연산자를 사용하여 날짜를 입력하면 특정 날짜 이후의 모든 로그 항목을 가져올 수 있습니다.

timestamp > "2016-11-29"

정규 표현식 사용

정규 표현식을 사용하여 쿼리를 빌드하고 싱크, 측정항목, 로그 필터가 사용되는 위치에 대한 필터를 만들 수 있습니다. 예를 들어, 쿼리 빌더Google Cloud CLI에서 정규 표현식을 사용할 수 있습니다.

정규 표현식은 검색을 정의하는 일련의 문자입니다. 로깅 쿼리 언어는 RE2 문법을 사용합니다. RE2 문법에 대한 자세한 설명은 GitHub의 RE2 위키를 참조하세요.

정규 표현식 쿼리의 특징은 다음과 같습니다.

  • 문자열 유형의 필드만 정규 표현식과 일치할 수 있습니다.

  • 문자열 정규화는 수행되지 않습니다. 예를 들어 kubernetesKUBERNETES와 동일하지 않습니다. 자세한 내용은 비교 연산자 섹션을 참조하세요.

  • 쿼리는 대소문자를 구분하며 기본적으로 고정되지 않습니다.

  • 불리언 연산자를 정규 표현식 비교 연산자(=~!~) 오른쪽에 있는 여러 정규 표현식에서 사용할 수 있습니다.

정규 표현식 쿼리 구조는 다음과 같습니다.

패턴 일치:

jsonPayload.message =~ "regular expression pattern"

패턴과 일치하지 않음:

jsonPayload.message !~ "regular expression pattern"

=~!~는 쿼리를 정규 표현식 쿼리로 변경하며 일치시키려는 패턴은 큰따옴표 안에 있어야 합니다. 큰따옴표를 포함하는 패턴을 쿼리하려면 백슬래시를 사용하여 이스케이프 처리합니다.

정규 표현식을 사용하여 로그를 쿼리하는 예시

쿼리 유형
표준 쿼리 sourceLocation.file =~ "foo"
대소문자를 구분하지 않는 검색 쿼리 labels.subnetwork_name =~ "(?i)foo"
따옴표가 포함된 쿼리 jsonPayload.message =~ "field1=\"bar.*\""
불리언 or를 사용하는 쿼리 labels.pod_name =~ "(foo|bar)"
앵커를 사용하는 쿼리 logName =~ "/my%2Flog$"
패턴과 일치하지 않는 쿼리 labels.pod_name !~ "foo"
불리언 연산자를 사용하는 쿼리 labels.env =~ ("^prod.*server" OR "^staging.*server")
값으로 시작하는 쿼리 logName =~ "^foo"
값으로 끝나는 쿼리 logName =~ "foo$"

로그 항목 빨리 찾기

효율적으로 로그 항목을 찾으려면 다음을 수행합니다.

  • 색인이 생성된 필드를 사용하여 쿼리합니다.
  • 검색되어야 하는 로그 항목의 개수를 최소화합니다.

색인이 생성된 필드 사용

Logging은 항상 다음 LogEntry 필드의 색인을 생성합니다.

또한 로그 버킷에 커스텀 색인이 처리된 필드를 추가할 수 있습니다.

다음 섹션에서는 이러한 색인이 처리된 필드를 사용하여 검색할 로그 항목의 개수를 최소화하는 방법을 설명합니다.

쿼리 최적화

로그 수, 로그 항목 수, 검색 시간 범위를 제한하면 더 빠르게 검색할 수 있습니다. 이 세 가지를 모두 줄이면 더 빠른 검색이 가능합니다.

예: 올바른 로그 이름 사용

관심 있는 로그 항목이 포함된 로그를 지정하세요. 로그 항목 중 하나를 검사하여 실제 로그 이름을 확인해야 합니다. 예를 들어, 미리보기에서는 Compute Engine 섹션에 "activity"라는 이름의 로그가 포함되어 있음을 보여줍니다. 관리자 활동 감사 로그 항목을 자세히 살펴보면 실제 로그 이름은 'cloudaudit.googleapis.com/activity'입니다.

다음 비교는 잘못되었습니다. 잘못된 로그 이름을 사용하고 있기 때문에 어떤 것과도 일치하지 않습니다.

logName = "projects/my-project-id/logs/activity"   -- WRONG!

다음 비교는 올바릅니다. 관리자 활동 감사 로그 항목에서 로그 항목을 선택합니다. 다음과 같이 로그 이름을 URL로 인코딩해야 합니다.

logName = "projects/my-project-id/logs/cloudaudit.googleapis.com%2Factivity"

예시: 올바른 로그 항목의 선택

원하는 로그 항목이 특정 VM 인스턴스에서 온다는 것을 알고 있으면 해당 인스턴스를 지정하세요. 검색하려는 로그 항목 중 하나를 검사하여 라벨 이름이 올바른지 확인하세요. 다음 예시에서 instance_id는 색인이 생성된 라벨 중 하나입니다.

resource.type = "gce_instance" AND
resource.labels.instance_id = "6731710280662790612"
logName = "projects/my-project-id/logs/cloudaudit.googleapis.com%2Factivity"

예시: 올바른 기간 선택

검색할 기간을 지정합니다. RFC 3339 형식의 유용한 타임스탬프를 결정하는 빠른 방법은 GNU/Linux date 명령어를 사용하는 것입니다.

$ date --rfc-3339=s
2016-06-27 17:39:00-04:00
$ date --rfc-3339=s --date="3 hours ago"
2016-06-27 14:40:00-04:00
$ date --rfc-3339=s --date="5 hours ago"
2016-06-27 12:40:00-04:00

다음 쿼리에 이 타임스탬프 값을 사용하세요. Logging에서 사용할 수 있는 타임스탬프를 만들려면 날짜와 시간 사이의 공백을 문자 T로 바꿉니다.

예를 들어 최근 3시간 범위 내에서 검색하려면 다음을 사용하세요.

timestamp >= "2016-06-27T14:40:00-04:00"

또 다른 예로 3시간에서 5시간 전 사이의 범위에서 검색하려면 다음을 사용하세요.

timestamp >= "2016-06-27T12:40:00-04:00" AND
timestamp <= "2016-06-27T14:40:00-04:00"

전체 검색과 하위 문자열 검색 최소화

쿼리를 입력할 때 간편한 방법을 찾으려고 시도하지 마세요.

예시: 전체 검색을 사용하지 마세요.

페이로드에 'Hello, Kitty'가 포함된 로그 항목을 검색하려는 경우 다음 안내를 따르세요.

  • 전체 검색을 사용하지 마세요. 한 가지 이유로는 모두 하위 문자열 검색입니다.

       "Hello Kitty"   -- THIS CAUSES A SLOW SEARCH!
       

  • 하위 문자열 검색을 유지해야 하더라도 검색 대상을 단일 필드로 제한하세요.

       textPayload:"Hello Kitty"
       

  • 가능하다면 동일성 테스트를 사용하세요.

       textPayload = "Hello Kitty"
       

  • 로그 항목에 구조화된 페이로드가 있는 경우 페이로드의 각 필드를 참조하세요.

       jsonPayload.my_favorite_cat = "Hello Kitty"
       

  • 색인이 지정된 필드를 사용하여 검색 범위를 제한하세요.

       logName = "projects/my-project_id/logs/somelog" AND
       jsonPayload.my_favorite_cat = "Hello Kitty"
       

  • SEARCH 함수를 사용하고 일치시킬 전체 텍스트를 지정합니다. SEARCH 함수는 대소문자를 구분하지 않는 일치를 수행합니다.

      SEARCH("Hello Kitty")
      

    SEARCH 함수를 사용하지 말고 부분 텍스트를 지정합니다. 예를 들어, 다음 함수는 "Hello Kitty"에 일치를 수행하지 않습니다.

      SEARCH("Hello Kit")
      

검색의 예

아래의 로그 항목은 쿼리와 일치하는 항목입니다. 이동할 시간 메뉴에 값이 포함되어 있으면 화면이 그 시점까지 스크롤됩니다. 다음은 몇 가지 쿼리 예시입니다.

resource.type=gae_app

모든 App Engine 로그 항목을 찾습니다. 리소스 유형 목록은 모니터링 리소스 목록을 참조하세요.

입력과 동시에 미리보기는 resource.type과 같은 전체 필드 이름을 제안합니다.

resource.type=gae_app AND logName:request_log

request_log를 포함하는 로그 이름에서 App Engine 앱의 로그 항목을 찾습니다. 다음과 같은 사항에 유의하세요.

  • = 연산자는 정확하게 동일입니다. 리소스 유형은 대소문자에 관계없이 정확히 "gae_app"이어야 합니다.
  • : 연산자는 'has'를 의미합니다. logName 필드에는 대소문자에 관계없이 request_log가 포함되어야 합니다. 실제 로그 이름은 훨씬 더 깁니다. :을 사용하면 검색 속도가 더 느려질 것입니다.
  • 비교가 2개인 경우 AND로 결합합니다. OR을 사용해도 되지만 연산자를 빼버리면 AND로 간주됩니다.
resource.type = (gce_instance OR aws_ec2_instance) AND severity >= ERROR

Compute Engine VM 인스턴스와 AWS EC2 VM 인스턴스의 두 가지 리소스 유형 중 하나가 있는 로그 항목을 찾습니다. 로그 항목의 severity는 최소한 ERROR여야 합니다. 이는 쿼리 인터페이스의 심각도 메뉴에서 오류를 선택하는 것과 같습니다.

logName = "projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"

[PROJECT_ID] 프로젝트에서 모든 관리자 활동 감사 로그 항목을 찾습니다. 한 프로젝트 내의 감사 로그는 모두 동일한 로그 이름을 사용하지만 리소스 유형은 서로 다릅니다. 로그 ID cloudaudit.googleapis.com/activity는 로그 이름에서 URL로 인코딩되어야 합니다. 비교 시 등호를 사용하면 검색 속도가 빨라집니다. 자세한 내용은 감사 로그 이해를 참조하세요.

unicorn

특정 필드에서 대소문자에 관계없이 unicorn이 포함된 로그 항목을 찾습니다. 필드 비교의 일부가 아닌 검색어는 '모든 필드' 쿼리입니다.

unicorn phoenix

일부 필드에는 unicorn, 일부 필드에는 phoenix가 포함된 로그 항목을 찾습니다.

textPayload:(unicorn phoenix)

textPayload 필드에 순서에 관계없이 unicornphoenix이 포함된 로그 항목을 찾습니다. 이때 AND는 두 단어 사이에 내포되어 있습니다.

textPayload:"unicorn phoenix"

textPayload 필드에 "unicorn phoenix"라는 문자열이 포함된 로그 항목을 찾습니다.

NOT textPayload: "unicorn phoenix"

textPayload 필드에 "unicorn phoenix" 문자열이 포함되지 않은 로그 항목을 찾습니다. 이 유형의 쿼리는 원치 않는 로그 항목을 줄입니다.

timestamp >= "2016-11-29T23:00:00Z" timestamp <= "2016-11-29T23:30:00Z"

30분 기간 내의 로그 항목을 찾습니다.

문제 해결

구문 문제

쿼리의 표현식에 문제가 있는 경우 다음 사항을 확인해 보세요.

  • 쿼리가 문법 규칙을 준수하며 괄호와 따옴표가 제대로 되어 있습니다.

  • 로그 항목 필드 이름의 철자가 올바릅니다.

  • 불리언 연산이 대문자로 되어 있습니다(AND, OR, NOT).

  • NULL_VALUE를 사용하여 JSON null 값을 나타내야 합니다.

  • 전역 제한 형태의 불리언 표현식 또는 비교의 오른쪽에 있는 불리언 표현식은 괄호로 묶어서 명확하게 구분하는 것이 좋습니다. 예를 들어 아래의 쿼리 2개는 같아 보이지만 다릅니다.

    insertId = "ABC-1" OR "ABC-2"  -- ERROR!?
    insertId = ("ABC-1" OR "ABC-2")
    
  • 따옴표로 묶여 있지 않은 텍스트에 특수문자가 있어서는 안 됩니다. 확실하지 않다면 큰따옴표를 추가하세요. 예를 들어 아래의 첫 번째 비교는 하위 문자열 연산자(:)가 삽입되어 있으므로 잘못되었습니다. 비교는 따옴표로 묶어서 작성해야 합니다.

    insertId = abc:def  -- ILLEGAL!
    insertId = "abc:def"
    
  • Google Cloud CLI에서는 쿼리를 큰따옴표로 묶어야 합니다. gcloud logging 명령어를 사용하여 특수문자를 이스케이프하는 큰 따옴표를 사용하려면 전체 쿼리를 작은따옴표로 묶으세요.

    gcloud logging read 'resource.type=gce_instance AND jsonPayload.message="Stopped Unattended Upgrades Shutdown."'
    gcloud logging read 'timestamp>="2020-06-17T21:00:00Z"'
    

  • Any 메시지 유형과 연결된 필드를 필터링하면 value 필드가 자동으로 순회됩니다. 따라서 쿼리에 value를 포함하지 마세요.

    예를 들어 AuditLog 메시지의 Status 필드에는 google.protobuf.Any 유형의 details 필드가 있습니다. details 필드를 쿼리하려면 필터를 지정할 때 value 필드를 생략합니다.

    • 권장사항

      protoPayload.status.details.conditionNotMet.userVisibleMessage =~ "Specified reservation.*"
      
    • 금지사항

      protoPayload.status.details.value.conditionNotMet.userVisibleMessage =~ "Specified reservation.*"