수식 (Formulas)
수식(또는 표현식)은 각 로그 이벤트에 대한 계산 필드의 값을 정의해요. 로그 속성, 다른 계산 필드, 지원되는 함수와 연산자를 참조할 수 있어요. 수식을 작성하거나 편집할 때 편집기가 관련 필드, 함수, 연산자를 자동으로 제안해줘요.
출처: 문서
본문
기본 구문과 언어 구성 (Basic syntax and language constructs)
| 구성 (Construct) | 구문과 표기 (Syntax and Notation) |
|---|---|
tag이라는 예약 속성 또는 태그 |
tag (접두사 불필요)대시가 있는 태그는 백슬래시로 이스케이프해요.예: ci\-job\-id |
attr라는 속성 |
@attr (@ 접두사 사용) |
field라는 계산 필드 |
#field (# 접두사 사용) |
문자열 리터럴 (따옴표)예: text 또는 Quoted "text". |
"text"``"Quoted \"text\""(Log Search Syntax 적용) |
숫자 리터럴 (숫자)예: ten. |
10 |
파라미터 x, y를 가진 func라는 함수 |
func(x, y) |
연산자예: 피연산자 x, y를 가진 이진 연산자 *. |
x*y |
연산자 (Operators)
우선순위 순서대로 사용 가능한 연산자예요:
| 연산자 | 설명 |
|---|---|
() |
그룹화 또는 함수 호출 |
!, NOT, - |
논리적 또는 산술적 부정 |
^, % |
지수, 모듈로 |
*, / |
곱셈, 나눗셈 |
+, - |
덧셈, 뺄셈 |
<, <=, >, >= |
미만, 이하, 초과, 이상 |
==, != |
일치, 불일치 |
&&, AND |
논리 AND |
| ` |
함수 (Functions)
사용 가능한 함수는 다음과 같이 분류돼요:
- Arithmetic (산술)
- String (문자열)
- Logical (논리)
- Regex (정규식)
산술 (Arithmetic)
abs(num value)
숫자의 절댓값을 반환해요.
예시
| 예시 | 수식 | 결과 |
|---|---|---|
로그 이벤트에 다음 속성이 있어요:- @client_latency = 2- @server_latency = 3 |
#discrepancy = abs(@client_latency - @server_latency) |
#discrepancy = 1 |
ceil(num value)
숫자를 가장 가까운 정수로 올림해요.
예시
| 예시 | 수식 | 결과 |
|---|---|---|
로그 이벤트에 다음 속성이 있어요:@value = 2.2 |
#rounded_up = ceil(@value) |
#rounded_up = 3 |
floor(num value)
숫자를 가장 가까운 정수로 내림해요.
예시
| 예시 | 수식 | 결과 |
|---|---|---|
로그 이벤트에 다음 속성이 있어요:@value = 9.99 |
#rounded_down = floor(@value) |
#rounded_down = 9 |
max(num value, [ num value, …])
숫자 집합 중 최댓값을 찾아요.
예시
| 예시 | 수식 | 결과 |
|---|---|---|
로그 이벤트에 다음 속성이 있어요:@CPU_temperatures = [-1, 1, 5, 5] |
#highest_temp = max(@CPU_temperatures) |
#highest_temp = 5 |
min(num value, [num value, …])
숫자 집합 중 최솟값을 찾아요.
예시
| 예시 | 수식 | 결과 |
|---|---|---|
로그 이벤트에 다음 속성이 있어요:@CPU_temperatures = [-1, 1, 5, 5] |
#lowest_temp = min(@CPU_temperatures) |
#lowest_temp = -1 |
round(num value, int precision)
숫자를 반올림해요. 선택적으로 유지할 소수 자릿수를 정의할 수 있어요.
예시
| 예시 | 수식 | 결과 |
|---|---|---|
로그 이벤트에 다음 속성이 있어요:@value = -1234.01 |
#rounded_to_tens = round(@value, -1) |
#rounded_to_tens = -1230 |
문자열 (String)
concat(str string [str string, expr value, …])
여러 값을 하나의 문자열로 결합해요.
예시
| 예시 | 수식 | 결과 |
|---|---|---|
로그 이벤트에 다음 속성이 있어요:- @city = "Paris"- @country = "France" |
#region = concat(@city, ", ", @country) |
#region = "Paris, France" |
lower(str string)
문자열을 소문자로 변환해요.
예시
| 예시 | 수식 | 결과 |
|---|---|---|
로그 이벤트에 다음 속성이 있어요:@first_name = "Bob" |
#lower_name = lower(@first_name) |
#lower_name = "bob" |
left(str string, int num_chars)
문자열의 시작 부분에서 텍스트 일부를 추출해요.
예시
| 예시 | 수식 | 결과 |
|---|---|---|
로그 이벤트에 다음 속성이 있어요:@price = "USD10.50" |
#currency = left(@price, 3) |
#currency = "USD" |
proper(str string)
문자열을 proper case로 변환해요 (각 단어의 첫 글자를 대문자로).
예시
| 예시 | 수식 | 결과 |
|---|---|---|
로그 이벤트에 다음 속성이 있어요:@address = "123 main st" |
#formatted_address = proper(@address) |
#formatted_address = "123 Main St" |
split_before(str string, str separator, int occurrence)
문자열에서 특정 패턴 앞에 오는 텍스트 부분을 추출해요.
예시
| 예시 | 수식 | 결과 |
|---|---|---|
로그 이벤트에 다음 속성이 있어요:@url = "www.example.com/path/to/split" |
#url_extraction = split_before(@url, "/", 1) |
#url_extraction = "www.example.com/path" |
#url_extraction = split_before(@url, "/", 2) |
#url_extraction = "www.example.com/path/to" |
split_after(str string, str separator, int occurrence)
문자열에서 특정 패턴 뒤에 오는 텍스트 부분을 추출해요.
예시
| 예시 | 수식 | 결과 |
|---|---|---|
로그 이벤트에 다음 속성이 있어요:@url = "www.example.com/path/to/split" |
#url_extraction = split_after(@url, "/", 0) |
#url_extraction = "path/to/split" |
#url_extraction = split_after(@url, "/", 1) |
#url_extraction = "to/split" |
substring(str string, int start, int length)
문자열의 중간에서 텍스트 일부를 추출해요.
예시
| 예시 | 수식 | 결과 |
|---|---|---|
로그 이벤트에 다음 속성이 있어요:@price = "USD10.50" |
#dollar_value = substring(@price, 2, 2) |
#dollar_value = "10" |
right(str string, int num_chars)
문자열의 끝에서 텍스트 일부를 추출해요.
예시
| 예시 | 수식 | 결과 |
|---|---|---|
로그 이벤트에 다음 속성이 있어요:@price = "USD10.50" |
#cent_value = right(@price, 2) |
#cent_value = "50" |
textjoin(str delimiter, bool ignore_empty, str string [str string, expr value, …])
여러 값을 그 사이에 구분자를 두고 하나의 문자열로 결합해요.
예시
| 예시 | 수식 | 결과 |
|---|---|---|
로그 이벤트에 다음 속성이 있어요:- @city = "Paris"- @country = "France" |
#region = textjoin(", ", "false", @city, @country) |
#region = "Paris, France" |
upper(str string)
문자열을 대문자로 변환해요.
예시
| 예시 | 수식 | 결과 |
|---|---|---|
로그 이벤트에 다음 속성이 있어요: @first_name = "Bob" |
#upper_name = upper(@first_name) |
#upper_name = "BOB" |
논리 (Logical)
if(expr condition, expr if_true, expr if_false)
조건을 평가하고 그에 따라 값을 반환해요.
예시
| 예시 | 수식 | 결과 |
|---|---|---|
로그 이벤트에 다음 속성이 있어요:- @location = "Paris, France"- @home = "New York, USA" |
#abroad = if(@location == @home, "false", "true") |
#abroad = "true" |
is_null(expr value)
속성 또는 표현식이 null인지 확인해요.
예시
| 예시 | 수식 | 결과 |
|---|---|---|
로그 이벤트에 다음 속성이 있어요:- @users_online = 5- @max_capacity = 0 |
is_null(@users_online / @max_capacity) |
"true" |
정규식 (Regex)
Regex 함수는 정규식(regex)으로 값을 일치시키거나 변환해요. 패턴은 regex extraction과 동일한 regex 구성을 지원해요(리터럴, 문자 클래스, 수량자 등). 동일한 pattern performance 지침이 적용돼요. 추출과 달리 수식 패턴의 캡처 그룹은 이름이 필요 없어요.
수식 인자는 큰따옴표로 묶인 문자열 리터럴이므로, 리터럴 백슬래시는 두 개의 백슬래시로 작성해야 해요. 예를 들어 숫자 약식 클래스를 일치시키려면 패턴에 "\\d"로 작성해요. 교체 문자열에도 같은 규칙이 적용돼요: 그룹 참조가 아닌 리터럴 달러 기호를 넣으려면 "\\$"로 작성해요.
regexp_like(str value, str pattern)
패턴이 값의 어디에서든 일치하면 true를, 그렇지 않으면 false를 반환해요.
예시
| 예시 | 수식 | 결과 |
|---|---|---|
로그 이벤트에 다음 속성이 있어요:message = "connection timeout after 30s" |
#is_timeout = regexp_like(message, "timeout|deadline exceeded") |
#is_timeout = "true" |
regexp_replace(str input, str pattern, str replacement, [int start, int N])
일치하는 텍스트가 교체된 input을 반환해요. replacement에서 $1~$9를 사용해 캡처 그룹의 일치 항목을 삽입하거나, 명명된 그룹에 ${name}을 사용해요.
| 인자 | 의미 |
|---|---|
input |
변환할 텍스트 |
pattern |
일치시킬 regex 패턴 |
replacement |
종종 캡처 그룹을 사용하는 regex 변환 패턴 |
start |
선택 사항. 일치를 시작할 0 기반 문자 인덱스. 기본값은 0 |
N |
선택 사항. 교체할 최대 일치 수. 기본값은 1. 0은 모든 일치를 교체 |
예시
| 예시 | 수식 | 결과 |
|---|---|---|
로그 이벤트에 다음 속성이 있어요:@path = "/api/v1/orders" |
#resource = regexp_replace(@path, "^/api/v[0-9]+/(.*)$", "$1") |
#resource = "orders" |