Logging 쿼리 언어

이 페이지에서는 로그 데이터를 쿼리하고 로그 싱크를 만드는 데 사용되는 Logging 쿼리 언어를 설명합니다.

Google Cloud Console, Logging API 또는 명령줄 인터페이스의 Cloud Logging 쿼리 빌더 창에서 쿼리를 사용할 수 있습니다.

쿼리 구문

이 섹션에서는 쿼리의 구조와 일치 수행 방법을 설명합니다.

쿼리는 로그 개수에 관계없이 로그에서 로그 항목 집합을 지정할 수 있는 표현식입니다. 쿼리는 프로젝트의 모든 로그 항목 하위 집합을 지정하는 부울 표현식입니다.

논리 연산자 ANDOR를 사용하여 다음 4가지 측정기준을 기반으로 쿼리를 빌드할 수 있습니다.

  • 리소스: 자세한 내용은 resource.type을 참조하세요.
  • 로그 이름: 자세한 내용은 logName을 참조하세요.
  • 심각도: 자세한 내용은 심각도를 참조하세요.
  • 시간 범위: 자세한 내용은 타임스탬프를 참조하세요.

사용하려는 일반적인 쿼리의 예시는 로그 뷰어(미리보기)를 사용하는 샘플 쿼리를 참조하세요.

구문 표기법

쿼리 구문은 다음과 같은 표기법으로 표현됩니다.

  • a = ea가 표현식 e의 이름이라는 뜻입니다.
  • a b는 'a 다음에 b가 온다'는 뜻입니다.
  • a | b는 'a 또는 b'라는 뜻입니다.
  • ( e )는 그룹화에 사용됩니다.
  • [ e ]e가 선택사항이라는 뜻입니다.
  • { e }e를 0회 이상 반복할 수 있다는 뜻입니다.
  • 'abc'는 abc를 보이는 그대로 작성해야 한다는 뜻입니다.

구문 요약

이 섹션에서는 쿼리 구문의 개요를 제공합니다.

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

   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"입니다.

쿼리와 일치에 관해서는 다음 섹션에서 더 자세히 다룹니다.

부울 연산자

부울 연산자 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을 사용합니다.

비교

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

[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"
    

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

  • [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]는 비교하기 전에 필드 유형으로 변환됩니다.

[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 드는 문자열이므로 다음에 어떠한 하위 필드 이름도 올 수 없습니다.

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

모니터링 리소스 유형

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

예를 들어 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 텍스트를 포함하는 문자열. 삽입된 따옴표는 백슬래시로 이스케이프 처리합니다.
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'.

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

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

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

로그 필드의 유형

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

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

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

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

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

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

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

비교 연산자

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

  • 모든 숫자 유형: 숫자에 대한 일반적인 등호와 부등을 의미합니다.
  • 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"

전역 제한은 쉽지만 속도가 느릴 수 있습니다. 자세한 내용은 이 페이지의 로그 항목 빨리 찾기를 참조하세요.

함수

쿼리에서 기본 제공 함수를 전역 제한으로 사용할 수 있습니다.
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")

sample

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

시간으로 검색

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

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

타임스탬프 쿼리를 작성할 때 날짜와 시간을 위에 표시된 형식으로 사용해야 합니다.

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

  timestamp > "2016-11-29"

정규 표현식 사용

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

정규 표현식은 검색을 정의하는 일련의 문자입니다. 쿼리 언어는 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")