Splunk JSON_PART2/ json 배열, json 관련 함수/ Splunk JSON 2탄

Munang·2022년 12월 7일
1

splunk

목록 보기
21/57
post-custom-banner

Splunk에서 은근 json 데이터를 많이 다루게 되는데, 이때 무조건 json 관련 함수를 쓰게된다. 쓸 때마다 찾아봐야해서 블로그에 정리해두려고 한다.

일단 공식 홈페이지에 가보면 json 과 관련된 함수가 11개나 있다. 각기 사용 방법이 다른데, 비슷한듯 하면서도 다르다.

1탄과 2탄을 나눠서 쓰는데, 2탄에서는 json 배열과 관련된 함수와 json 정보를 다루는 함수에 대해서 설명한다.

1. JSON 배열 관련

1. JSON 특정 key의 배열로 이뤄진 value에 element 추가하기 json_append

  • 배열에 element 추가하기
    이미 잘 만들어진 json 객체가 있다고 하자. 여기서 spave travel 속성은 ["Star Wars","Intersesllar","Moon"]
    이러한 배열의 값을 가지는데, 어떤 조건이 생길 때마다 혹은 특정 값을 추가해서 json을 수정하고 싶다면 다음과 같이 json_append를 사용하면 된다.
| makeresults
| eval json_data = json_object("movies",json_object("genres",json_object("sci-fi",json_object("space travel", json_array("Star Wars", "Intersesllar", "Star Trek")))))
| eval json_data = json_set(json_data,"movies.genres.sci-fi.time travel",json_array("Looper", "Twelve Monkeys","Doctor who"))
| eval json_data = json_set(json_data,"movies.genres.sci-fi.space travel{2}","Moon")
| eval json_data_new = json_append(json_data, "movies.genres.sci-fi.space travel","Star Trek")

이 쿼리에서는 movies.genres.sci-fi.space travel 에 Star Trek 이라는 value를 추가했다. 결과는 다음과 같이 나온다.

| makeresults
| eval json_data = json_object("movies",json_object("genres",json_object("sci-fi",json_object("space travel", json_array("Star Wars", "Intersesllar", "Star Trek")))))
| eval json_data = json_set(json_data,"movies.genres.sci-fi.time travel",json_array("Looper", "Twelve Monkeys","Doctor who"))
| eval json_data = json_set(json_data,"movies.genres.sci-fi.space travel{2}","Moon")
| eval json_data_new = json_append(json_data, "movies.genres.sci-fi.space travel","Star Trek","movies.genres.sci-fi.time travel","Primer")

동시에 여러개를 추가할 수도 있다. 이번에는 기존에 추가했던 내용에 movies.genres.sci-fi.time travel 경로에 Primer이라는 값을 추가했다.

  • 배열에 배열을 추가하기
    기존에 있던 배열에 다시 추가로 배열을 넣어서 2중 배열로 구성할 수도 있다.
| makeresults
| eval json_data = json_object("movies",json_object("genres",json_object("sci-fi",json_object("space travel", json_array("Star Wars", "Intersesllar", "Star Trek")))))
| eval json_data = json_set(json_data,"movies.genres.sci-fi.time travel",json_array("Looper", "Twelve Monkeys","Doctor who"))
| eval json_data = json_set(json_data,"movies.genres.sci-fi.space travel{2}","Moon")
| eval json_data= json_append(json_data, "movies.genres.sci-fi.space travel","Star Trek","movies.genres.sci-fi.time travel","Primer")
| eval json_data_new = json_append(json_data, "movies.genres.sci-fi.space travel", json_array("Star Trek", "Avengers"), "movies.genres.sci-fi.time travel", "Primer")

이렇게 movies.genres.sci-fi.space travel 경로에 json_array("Star Trek", "Avengers") 를 추가해줬고, 결과는 다음과 같다.

2. 리스트 형태로 된 원소를 한번에 추가하기/2차원 배열을 1차원 배열로 확장 json_extend

  • 리스트 형태로 된 원소를 한번에 추가하기/2차원 배열을 2차원 배열로 확장
    위에서 2차원 배열을 구성했던 형태를 1차원으로 확장해야할 상황이 있다. 예를들어 여러개의 다중 원소로 구성된 배열을 추가하고 싶을때는 하나씩 쿼리를 치기 힘드니, 다중원소로 구성된 변수를 한번에 특정 배열에 추가해줄 수 있다. 그때 사용하는 것이 json_extend 이다.
| makeresults
| eval json_data = json_object("movies",json_object("genres",json_object("sci-fi",json_object("space travel", json_array("Star Wars", "Intersesllar", "Star Trek")))))
| eval json_data = json_set(json_data,"movies.genres.sci-fi.time travel",json_array("Looper", "Twelve Monkeys","Doctor who"))
| eval json_data = json_set(json_data,"movies.genres.sci-fi.space travel{2}","Moon")
| eval json_data= json_append(json_data, "movies.genres.sci-fi.space travel","Star Trek","movies.genres.sci-fi.time travel","Primer")
| eval json_data_new = json_extend(json_data, "movies.genres.sci-fi.space travel", json_array("Star Trek", "Avengers"), "movies.genres.sci-fi.time travel", "Primer")

json_array("Star Trek", "Avengers") 를 추가했고, 이를 1차원으로 확장시켜 준다.

3. 개행문자로 처리된 multilne 데이터를 한번에 추가하기

다음과 같은 데이터처럼 개행문자로 나뉘어진 multiline 데이터를 한번에 배열로 추가할 수 있다.

개행 문자로 이뤄진 변수를 space_travel_movies 라고 하면, mv_to_json_array를 이용해 배열로 추출했다.

| makeresults
| eval space_travel_movies = mvappend("Star Mars", "Interstellar", "Moon")
| eval json_data = json_object("movies",json_object("genres",json_object("sci-fi",json_object("space travel", mv_to_json_array(spave_travel_movies)))))

결과는 다음과 같다.

2. JSON 정보 관련

1. json_valid 유효한 JSON 확인

유효하지 않은 JSON 데이터를 전송하게 되면 웹서버에서 오류코드를 응답으로 받게된다.
이때 미리 유효한지 확인 후에 전송할 수 있게끔 사용하는 용도로 적합하다.

| makeresults
| eval json_data = json_object("movies",json_object("genres",json_object("sci-fi",json_object("space travel", json_array("Star Wars", "Intersesllar", "Star Trek")))))
| eval json_data = json_set(json_data,"movies.genres.sci-fi.time travel",json_array("Looper", "Twelve Monkeys","Doctor who"))
| eval json_data = json_set(json_data,"movies.genres.sci-fi.space travel{2}","Moon")
| eval is_valid = if(json_valid(json_data),"True","False")

json_valid 함수를 사용하면 된다.

2. json_keys Json 객체의 키 확인

json 객체의 키를 확인하고 싶다. json_keys를 사용하면 된다. 이때 주의할 점은 최상위 속성의 키값만 나오게 된다.

하위 속성의 키값을 보고싶으면 json_exact를 결합해서 사용해야한다.(특정 키 값에 대한 value 추출)

| makeresults
| eval json_data = json_object("movies",json_object("genres",json_object("sci-fi",json_object("space travel", json_array("Star Wars", "Intersesllar", "Star Trek")))))
| eval json_data = json_set(json_data,"movies.genres.sci-fi.time travel",json_array("Looper", "Twelve Monkeys","Doctor who"))
| eval json_data = json_set(json_data,"movies.genres.sci-fi.space travel{2}","Moon")
| eval keys = json_keys(json_data)

3. json_extract 특정 Key값의 value값 추출

특정 key 값에 대응되는 value를 추출할 때 사용된다.
다음과 같이 추출하려는 json객체, key경로를 사용해서 함수를 구성하면 된다.
json_extract(json_data,"movies.genres.sci-fi.space travel")
쿼리 전체를 확인하면 다음과 같다.

| makeresults
| eval json_data = json_object("movies",json_object("genres",json_object("sci-fi",json_object("space travel", json_array("Star Wars", "Intersesllar", "Star Trek")))))
| eval json_data = json_set(json_data,"movies.genres.sci-fi.time travel",json_array("Looper", "Twelve Monkeys","Doctor who"))
| eval json_data = json_set(json_data,"movies.genres.sci-fi.space travel{2}","Moon")
| eval extracted_data = json_extract(json_data,"movies.genres.sci-fi.space travel")

post-custom-banner

0개의 댓글