Splunk: SPL 시작하기

728x90

Splunk SPL이란?

Splunk SPL(Search Processing Language)은 Splunk에서 데이터를 검색, 분석 및 시각화하는 데 사용하는 강력한 쿼리 언어입니다.(DB의 SQL과 유사함)

파이프라인(|)

SPL은 파이프라인 개념을 사용하여 여러 명령어를 | (파이프) 문자로 연결하여 데이터를 단계별로 처리합니다. 마치 컨베이어 벨트 위에서 데이터가 각 공정을 거치며 가공되는 것과 같습니다.

 

기본 구조:

검색 조건 | 명령어1 | 명령어2 | 명령어3 ...

index 필드

index는 Splunk에서 가장 기본적인 데이터 컨테이너입니다. 데이터를 수집할 때 물리적인 파일들로 저장하고 관리하는 공간(저장소)을 의미하죠. 데이터베이스의 '테이블'이나 '데이터베이스' 자체와 유사한 개념으로 생각할 수 있습니다.

index 필드 사용 예시

SPL은 검색어의 가장 첫 부분에 index="인덱스명" 형태로 사용하는 것이 일반적입니다.

검색을 시작할 때 index를 지정하는 것은 가장 먼저, 그리고 가장 효율적으로 검색 범위를 좁히는 방법입니다. 어떤 창고에서 물건을 찾을지 먼저 정하는 것과 같습니다.

 

1. 단일 인덱스 검색

가장 기본적인 형태로, 특정 데이터 저장소에서만 검색을 수행합니다.

  • 웹 서버 로그 검색: 웹 트래픽과 관련된 모든 로그를 검색합니다.
  • index="web"

2. 여러 인덱스 동시 검색

OR 연산자를 사용하거나 와일드카드(*)를 사용하여 여러 인덱스를 한 번에 검색할 수 있습니다.

  • 웹과 네트워크 로그 동시 검색: OR를 사용하여 명시적으로 두 개의 인덱스를 지정합니다.
  • index="web" OR index="network"
  • 모든 운영체제 로그 검색: 공통된 접두사를 가진 인덱스들을 와일드카드로 한 번에 검색합니다.
  • `index="os_*"` *(예: `os_windows`, `os_linux` 인덱스를 모두 포함)*

3. 다른 필드와 조합하여 사용

index로 큰 데이터 범위를 지정한 후, 다른 필드 조건을 추가하여 원하는 데이터를 정밀하게 찾아냅니다.

  • 웹 404 에러 검색: "web" 인덱스에서 소스타입이 "access_combined"이고 상태 코드가 404인 이벤트 검색
  • index="web" sourcetype="access_combined" status=404 | top limit=10 uri
  • 방화벽 차단 로그 검색: "firewall" 인덱스에서 "blocked"(차단)된 로그 중 특정 출발지 IP 대역을 검색
  • index="firewall" action="blocked" src_ip="192.168.10.0/24"
  • 윈도우 로그인 실패 이벤트 검색: "wineventlog" 인덱스에서 보안 로그 중 이벤트 코드가 4625(로그온 실패)인 이벤트를 검색Splunk SPL
  • index="wineventlog" sourcetype="WinEventLog:Security" EventCode=4625 | stats count by u

Splunk SPL의 핵심 구성 요소

Splunk SPL은 주로 다음과 같은 요소들로 구성됩니다.

  • 검색어 (Search Terms): 찾고 싶은 특정 키워드나 구문을 지정합니다.
  • 명령어 (Commands): 검색된 데이터에 대해 수행할 작업을 정의합니다. (예: stats, chart, table)
  • 함수 (Functions): 필드 값을 계산하거나 조작하는 데 사용됩니다. (예: sum(), avg(), count())
  • 인수 (Arguments): 명령어의 동작을 세부적으로 제어합니다.
  • 절 (Clauses): 데이터를 그룹화하거나 필드 이름을 바꾸는 등 명령어의 결과를 제어합니다. (예: by, as)

기본적인 SPL 쿼리 구조 예시

index="web" sourcetype="access_combined" status=200
| stats count by uri_path
| sort -count

위 쿼리는 "web" 인덱스와 "access_combined" 소스 타입에서 HTTP 상태 코드가 200 (성공)인 이벤트를 검색한 후, 각 uri_path 별로 이벤트 수를 계산하고, 마지막으로 이벤트 수가 많은 순서대로 정렬하여 보여줍니다.

자주사용되는 SPL 명령어

📊 통계 및 집계 (Statistics & Aggregation)

데이터의 의미를 파악하고 요약하기 위해 가장 핵심적인 명령어 그룹입니다.

  • stats: 가장 강력하고 빈번하게 사용되는 명령어 중 하나입니다. count, sum, avg, dc (distinct count), min, max 등 다양한 통계 함수와 함께 사용하여 데이터를 그룹화하고 계산합니다.
    • 예시: ... | stats count by host (호스트별 이벤트 수 계산)
  • top: 지정한 필드에서 가장 빈번하게 나타나는 상위 값들을 보여줍니다. (기본 10개)
    • 예시: ... | top limit=5 user (가장 활동이 많은 사용자 5명 표시)
  • rare: top과 반대로, 가장 드물게 나타나는 값들을 보여줍니다.
    • 예시: ... | rare product_id (가장 적게 팔린 제품 ID 표시)
  • chart / timechart: 시각화를 위한 데이터를 만드는 데 특화된 명령어입니다.
    • chart: 두 개 이상의 필드를 기준으로 통계 데이터를 테이블(차트용) 형태로 생성합니다.
    • timechart: 시간의 흐름에 따른 데이터 변화를 분석하는 데 사용되며, 시간 기반의 꺾은선, 막대, 영역 차트를 만드는 데 필수적입니다.
    • 예시: ... | timechart span=1h count by status_code (시간대별 HTTP 상태 코드 수 시각화)

🧹 필터링 및 결과 변환 (Filtering & Transforming)

원하는 데이터를 추출하고 보기 좋은 형태로 가공하는 데 사용됩니다.

  • search: 가장 기본적인 명령어로, 특정 키워드, 필드-값 쌍으로 이벤트를 필터링합니다. 쿼리의 가장 첫 부분에 위치하는 경우가 많습니다.
    • 예시: index=web status=404 (웹 인덱스에서 404 에러 검색)
  • table: 지정한 필드만 표(테이블) 형식으로 깔끔하게 보여줍니다.
    • 예시: ... | table _time, src_ip, dest_ip, status (시간, 출발지 IP, 목적지 IP, 상태 필드만 표로 표시)
  • rename: 필드의 이름을 직관적으로 알기 쉽게 변경합니다.
    • 예시: ... | rename src_ip as "출발지 IP" (src_ip 필드명을 "출발지 IP"로 변경)
  • fields: 결과에 포함하거나 제외할 필드를 지정합니다. fields -는 제외, fields +는 포함입니다.
    • 예시: ... | fields - _raw (_raw 필드를 결과에서 제외)
  • dedup: 특정 필드의 중복된 값을 제거하고 가장 최신 또는 가장 오래된 이벤트 하나만 남깁니다.
    • 예시: ... | dedup user (사용자별로 가장 최근의 이벤트 하나만 남김)
  • sort: 지정한 필드를 기준으로 결과를 정렬합니다. (기본은 내림차순, 오름차순은 sort + 또는 sort 명령어 뒤에 필드명만 사용)
    • 예시: ... | sort -count (count 필드를 기준으로 내림차순 정렬)
  • where: search 명령어보다 더 복잡한 조건(비교, 함수 결과 등)으로 결과를 필터링할 때 사용합니다.
    • 예시: ... | where bytes > 1024 (bytes 필드 값이 1024보다 큰 결과만 필터링)

✨ 필드 생성 및 조작 (Field Creation & Manipulation)

기존에 없는 새로운 필드를 만들거나 필드 값을 가공할 때 사용됩니다.

  • eval: 새로운 필드를 생성하거나 기존 필드의 값을 함수를 이용해 변환합니다. 산술 연산, 문자열 합치기, 조건문(if) 등 다양한 작업이 가능합니다.
    • 예시: ... | eval kb = bytes / 1024 (bytes 필드 값을 1024로 나눠 kb 필드 생성)
  • rex: 정규표현식(Regex)을 사용하여 비정형 데이터(_raw)에서 원하는 정보를 추출하여 새로운 필드로 만듭니다.
    • 예시: ... | rex field=_raw "user=(?<username>\w+)" (_raw 필드에서 "user=" 뒤의 단어를 username 필드로 추출)

🔗 조인 및 상관관계 분석 (Joining & Correlation)

다른 데이터 소스의 정보를 현재 검색 결과와 연결할 때 사용됩니다.

  • lookup: CSV 파일이나 KV Store 같은 외부 데이터 소스를 참조하여 현재 검색 결과에 필드를 추가(enrich)합니다.
    • 예시: ... | lookup user_info user as username OUTPUT location (username 필드 값과 일치하는 사용자의 위치 정보를 가져옴)

참고자료