REX 명령어

REX 명령어

rex 명령어는 정규 표현식 명명된 캡처 그룹을 사용해 원시 텍스트 필드에서 필드를 추출해요. Java 정규 표현식 패턴을 사용해요.

출처: 문서

본문

rex 명령어는 정규 표현식 명명된 캡처 그룹을 사용해 원시 텍스트 필드에서 필드를 추출해요. Java 정규 표현식 패턴을 사용해요. 자세한 내용은 Java 정규 표현식 문서를 참고해요.

rex와 parse 명령어 비교

rex와 parse 명령어는 모두 명명된 캡처 그룹이 있는 Java 정규 표현식을 사용해 텍스트 필드에서 정보를 추출해요. 다음 표는 rex와 parse 명령어의 기능을 비교해요.

기능 rex parse
패턴 타입 Java regex Java regex
명명된 그룹 필수 예 예
여러 명명된 그룹 예 아니요
여러 일치 예 아니요
텍스트 치환 예 아니요
오프셋 추적 예 아니요
그룹 이름의 특수 문자 아니요 아니요

구문 (Syntax)

rex 명령어의 구문은 다음과 같아요:

rex [mode=<mode>] field=<field> <pattern> [max_match=<int>] [offset_field=<string>]

매개변수 (Parameters)

rex 명령어는 다음 매개변수를 지원해요.

매개변수 필수/선택 설명
field 필수 데이터를 추출할 필드예요. 필드는 문자열이어야 해요.
<pattern> 필수 새 필드를 추출하는 데 사용되는 명명된 캡처 그룹이 있는 정규 표현식 패턴이에요. 패턴은 (?<name>pattern) 구문을 사용하는 명명된 캡처 그룹을 최소 하나 이상 포함해야 해요. 그룹 이름은 문자로 시작하고 문자와 숫자만 포함해야 해요.
mode 선택 패턴 매칭 모드예요. 유효한 값은 extract와 sed예요. extract 모드는 정규 표현식 명명된 캡처 그룹에서 새 필드를 만들어요. sed 모드는 sed 스타일 패턴(s/pattern/replacement/과 플래그, y/from_chars/to_chars/ 변환, 역참조 지원)을 사용해 텍스트 치환을 수행해요.
max_match 선택 추출할 최대 일치 수예요. 값이 1보다 크면 추출된 필드가 배열로 반환돼요. 값 0은 무제한 일치를 나타내지만, 유효 일치 수는 구성된 최대값에 의해 자동으로 제한돼요. 기본 최대값은 10이며 plugins.ppl.rex.max_match.limit로 구성할 수 있어요 (참고 참조). 기본값은 1이에요.
offset_field 선택 extract 모드에서만 유효해요. 일치 항목의 문자 오프셋 위치를 저장하는 필드의 이름이에요.

max_match 한도를 plugins.ppl.rex.max_match.limit 클러스터 설정에서 설정할 수 있어요. 자세한 내용은 SQL 설정을 참고해요. 이 한도를 큰 값으로 설정하는 것은 특히 빈 문자열과 일치하는 패턴(예: \d* 또는 \w*)에서 과도한 메모리 소비를 초래할 수 있으므로 권장하지 않아요.

예제 1: 로그 메시지에서 서비스 이름과 오류 타입 추출하기

다음 쿼리는 Java 예외 로그 메시지에서 오류 타입을 추출해요. 일치하지 않는 행은 추출된 필드에 null을 반환해요:

source=otellogs
| where severityText = 'ERROR'
| rex field=body "(?<errtype>[A-Z][a-zA-Z]+Exception)"
| fields body, errtype
| head 3

쿼리는 다음과 같은 결과를 반환해요:

body errtype
Payment failed: connection timeout to payment gateway after 30000ms null
NullPointerException in CheckoutService.placeOrder at line 142 NullPointerException
Out of memory: Java heap space - shutting down pod payment-6f8d4b-ht7q3 null

예제 2: max_match로 여러 단어 추출하기

다음 쿼리는 max_match 매개변수와 함께 rex 명령어를 사용해 body 필드에서 여러 단어를 추출해요. 추출된 필드는 문자열 배열로 반환돼요:

source=otellogs
| where severityText = 'WARN'
| rex field=body "(?<word>[A-Za-z]+)" max_match=3
| fields body, word

쿼리는 다음과 같은 결과를 반환해요:

body word
Slow query detected: SELECT * FROM products WHERE category = ‘electronics’ took 3200ms [Slow,query,detected]
Connection pool 80% utilized on database replica db-replica-02 [Connection,pool,utilized]
SSL certificate for api.example.com expires in 14 days [SSL,certificate,for]
Rate limit threshold reached: 450/500 requests per minute for API key ending in …abc789 [Rate,limit,threshold]

예제 3: sed 모드로 텍스트 대체하기

다음 쿼리는 sed 모드를 사용해 개인정보 보호 준수를 위해 로그 메시지의 IP 주소를 마스킹해요:

source=otellogs
| where LIKE(body, '%authenticated%') OR LIKE(body, '%credentials%')
| rex field=body mode=sed "s/[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+/xxx.xxx.xxx.xxx/"
| fields body

쿼리는 다음과 같은 결과를 반환해요:

body
User U300 authenticated via OAuth2 from xxx.xxx.xxx.xxx

예제 4: offset_field를 사용해 일치 위치 추적하기

다음 쿼리는 일치가 발생하는 문자 위치를 추적해요. UI에서 일치 항목을 강조 표시하는 데 유용해요:

source=otellogs
| where severityText = 'ERROR'
| rex field=body "(?<errtype>[A-Z][a-zA-Z]+Exception)" offset_field=pos
| where NOT ISNULL(errtype)
| fields body, errtype, pos

쿼리는 다음과 같은 결과를 반환해요:

body errtype pos
NullPointerException in CheckoutService.placeOrder at line 142 NullPointerException errtype=0-19

캡처 그룹 이름은 Java 정규 표현식의 제한 때문에 밑줄을 포함할 수 없어요. 예를 들어 (?<error_type>\w+)는 유효하지 않으므로 (?<errortype>\w+)를 사용해요.

자세한 Java 정규 표현식 패턴 구문과 사용법은 공식 Java Pattern 문서를 참고해요.

더 알아보기 (Learn more)