본문 바로가기

Splunk Tip

Splunk 에서 문자열을 합치는 2가지 방법

스플렁크에서 문자열을 쓰는 방식 중 가장 많이 쓰는건 아무래도 + 기호다.

|makeresults
|eval 결과="문"+"자"+"열"

+ 기호는 C 시절 부터 Python까지 프로그래밍 언어에서도 문자열을 합치는 유구한 방식이고,
직관성이 높기도 하다.

거기다가 Splunk는 많은 부분이 Python으로 돌아가는 프로그램이라서 인지는 몰라도,
형변환에서 매우 자유롭다.

|makeresults
|eval 값1="문자", 값2=2, 값3=3
|eval 결과1= 값1 + 값2, 결과2=값2+값3

결과 1과 결과2 모두 무리없이 출력된다.
결과1은 문자열로 계산해 합쳐지고, 결과2는 숫자로 계산해 합쳐진다.

그렇기 때문에 항상 + 기호만 써도 문제 없을 것 같다.

하지만 문제는 eval의 결과 값을 얻기 위해 문자열에 숫자 계산식을 넣을 경우 발생한다.

|makeresults
|eval 오늘가격=10000, 어제가격=8000
|eval 증감안내="오늘의 가격은 어제 대비 " + abs(round(1-오늘가격/어제가격,2)*100) + "% " + case(오늘가격 > 어제가격, "올랐네요", 오늘가격 < 어제가격, "내렸네요"))


이 쿼리를 보면 직관적으로 "오늘의 가격은 어제 대비 25% 올랐네요" 라는 결과값이 나와야 할 것 같다.
하지만 나오지 않는다.

대신

Error in 'eval' command: Type checking failed. '+' only takes two strings or two numbers


이란 경고문을 띄우며 결과값이 나오지 않는다.

스플렁크엔 형변환 따위 필요없이 찰떡같이 알아들을 줄 알았는데 아니었나?

어지간해선 맞는 말이지만
abs(숫자) - 절대값으로 만드는 함수, round(숫자,자리수) - 자리수 만큼 반올림해주는 함수
이 두 개는 결과값이 숫자형으로 고정되어 나오는데 앞 뒤엔 문자열이 나오는게 문제다.

사실 개인적인 생각으론 그냥 찰떡같이 알아서 숫자형 결과를 문자열로 바꿔줬으면 좋겠지만

네....

그렇다고 한다.

그래서 평소에 잘 안쓰던 한 가지 방식을 쓰는데
그것이 바로 마침표다.

|makeresults
|eval 오늘가격=10000, 어제가격=8000
|eval 증감안내="오늘의 가격은 어제 대비 ".abs(round(1-오늘가격/어제가격,2)*100)."% " + case(오늘가격 > 어제가격, "올랐네요", 오늘가격 < 어제가격, "내렸네요"))


마침표는 대상이 숫자이던 문자열이던 무조건 문자열로 변환해 이어붙인다.

이를 통해 원래부터 원하던 결과인
"오늘의 가격은 어제 대비 25% 올랐네요"
를 성공적으로 출력할 수 있다.