3.데이터 가공

Edit

3.1alertmsgalertmsg

경보 알림 메시지를 사용자가 지정한 언어 로케일로 변경해 출력합니다.

문법

alertmsg locale=LOCALE_CODE
locale=LOCALE_CODE

사용자 세션에서 경보 알림 메시지에 적용할 언어 로케일을 지정합니다. 현재 지원하는 언어는 en, ko입니다.

사용 예

1) 경보 알림 메세지를 한국어로 변환

table sys_alerts | alertmsg locale=ko

3.2auditmsgauditmsg

감사 로그를 사용자가 지정한 언어 로케일로 변경해 출력합니다.

문법

auditmsg locale=LOCALE_CODE
locale=LOCALE_CODE

사용자 세션에서 감사 로그 메시지에 적용할 언어 로케일을 지정합니다. 현재 지원하는 언어는 en, ko입니다.

사용 예

1) 감사 메세지를 한국어로 변환

table sys_audit_logs | auditmsg locale=ko

3.3boxplotboxplot

상자 그림(box plot)을 그리는데 필요한 최소, 최대, 사분위수를 계산합니다.

문법

boxplot EXPR [by GRP_FIELD_1, GRP_FIELD_2, ...]
EXPR

통계 대상이 되는 계산 수식을 입력합니다.

by GRP_FIELD_1, GRP_FIELD_2, ...

상자 그림의 대상이 되는 필드 이름을 입력합니다. 그룹 단위로 나누어 최소, 최대, 사분위수를 구하려면 그룹을 구분하는 기준이 될 필드 이름을 쉼표(,)로 구분하여 입력합니다.

설명

출력 필드는 아래와 같습니다:

사용 예

1) 전체 CPU 부하에 대한 통계 요약

table sys_cpu_logs
| eval usage = kernel + user 
| boxplot usage

2) 일자별 CPU 부하에 대한 통계 요약

table sys_cpu_logs
| eval day = string(_time, "yyyy-MM-dd")
| eval usage = kernel + user
| boxplot usage by day

3.4bypassbypass

모든 입력 값을 그대로 출력합니다. 모든 입력 필드에 대해 필드 인덱스를 생성하거나 스트림 쿼리에서 모든 결과를 그대로 통과시키는 목적으로 사용합니다.

문법

FORWARDING_STATEMENT | bypass

FORWARDING_STATEMENT

출력값을 전달하는 모든 형태의 쿼리문을 사용할 수 있습니다.

3.5cubecube

그룹 함수 사용 시 모든 항목별 합계가 필요한 경우 cube 함수를 사용합니다. by 절에 여러 필드가 있을 경우 모든 필드 조합에 대한 합계값을 표시합니다.

문법

cube [label=FIELD] [parallel=t] FUNCTION_1 [as ALIAS_1][, FUNCATION_2 [as ALIAS_2], ...] [by FIELD_1, FIELD_2, ...]
label=FIELD

집계값에 부여할 필드 이름을 지정합니다. 설정하지 않으면 null로 표시합니다.

parallel=t

쿼리를 병렬 처리합니다. 이 옵션을 사용하면 처리 속도가 증가하지만, 데이터의 순서를 보장하지 않습니다(기본값: f).

FUNCTION_1 [as ALIAS_1][, FUNCTION_2 [as ALIAS_2], ...]

합계를 계산할 대상 그룹 함수 이름과 필드 이름, 표시할 이름을 지정합니다.

[by FIELD_1, FIELD_2, ...]

집계 대상 필드를 지정합니다.

cube 명령어는 ENT #1804 2017-11-28_13-31 일자 버전부터 지원합니다.

사용 예

1) action 필드별 계수 및 전체 계수

cube count by action

2) action, status 필드별 계수와 size 합계 및 action 필드별 계수와 size 합계 (라벨은 "TOTAL"로 표시)

cube label=TOTAL count, sum(size) as size by action, status

3.6curvefitcurvefit

입력 레코드 값에 대하여 최소제곱법을 이용한 선형회귀분석을 수행합니다.

문법

curvefit [degree=NUM] INDEPENDENT_FIELD, DEPENDENT_FIELD
degree=NUM

입력값을 근사시킬 다항 함수의 차수 지정합니다. 지정하지 않으면 3차 함수로 근사합니다.

INDEPENDENT_FIELD

독립변수로 사용할 필드 이름을 지정합니다. 독립변수 값은 숫자형이어야 합니다.

DEPENDENT_FIELD

종속변수로 사용할 필드 이름을 지정합니다. 종속변수 값은 숫자형이어야 합니다.

설명

최대 1만개의 입력 레코드 값에 대하여 최소제곱법을 이용한 선형회귀분석을 수행합니다. 독립변수 필드 값을 _x 필드로, 그리고 계산된 함수 값을 _p 필드로 출력합니다. 1만 개 이후의 레코드는 무시하고 쿼리를 종료합니다.

사용 예

1) 최근 1시간의 CPU 사용율 추이를 10차 다항함수로 근사

table duration=1h sys_cpu_logs 
| eval x = datediff(dateadd(now(), "hour", -1), _time, "sec") 
| eval total = kernel + user 
| curvefit degree=10 x, total

3.7decodedhcpdecodedhcp

PCAP 파일에서 DHCP 통신 내용을 디코딩해 보여줍니다. 패킷 단위로 디코딩하려면 pcapdecode 명령을 이용하세요.

문법

PCAP_FORWARDING_STATEMENT | decodedhcp
PCAP_FORWARDING_STATEMENT

pcapfile 명령어를 이용하거나, PCAP 수집기로부터 데이터 스트림을 받을 수 있도록 logger 명령어를 이용하거나, 다른 데이터 스트림을 이용하도록 stream 명령어를 이용해 작성합니다. 그 외에도 PCAP 데이터를 전달하는 쿼리문이라면 무엇이든 사용할 수 있습니다.

설명

파이프(|)로 전달받은 데이터에서 DHCP 통신 페이로드만 확인해 출력합니다. 출력하는 필드는 다음과 같습니다.

사용 예

1) 임의의 PCAP 파일에서 DHCP 통신만 디코딩

pcapfile /opt/logpresso/pcap/dhcp.pcap | decodedhcp

3.8decodednsdecodedns

PCAP 파일에서 DNS 쿼리 내용을 디코딩해 보여줍니다. 패킷 단위로 디코딩하려면 pcapdecode 명령을 이용하세요.

문법

PCAP_FORWARDING_STATEMENT | decodedns
PCAP_FORWARDING_STATEMENT

pcapfile 명령어를 이용하거나, PCAP 수집기로부터 데이터 스트림을 받을 수 있도록 logger 명령어를 이용하거나, 다른 데이터 스트림을 이용하도록 stream 명령어를 이용해 작성합니다. 그 외에도 PCAP 데이터를 전달하는 쿼리문이라면 무엇이든 사용할 수 있습니다.

설명

DNS 쿼리 페이로드만 확인해 출력합니다. 출력하는 필드는 다음과 같습니다.

decodedns 명령어는 ENT #2309 2019-11-27_10-43 일자 버전부터 지원합니다.

사용 예

1) 임의의 PCAP 파일에서 DNS 통신만 디코딩

pcapfile /opt/logpresso/pcap/abnormal_traffic.pcap | decodedns

3.9decodehttpdecodehttp

PCAP 파일에서 HTTP 트랜잭션 헤더의 특정 필드 값을 디코딩해 보여줍니다. 패킷 단위로 디코딩하려면 pcapdecode 명령을 이용하세요.

문법

PCAP_FORWARDING_STATEMENT | decodedns
PCAP_FORWARDING_STATEMENT

pcapfile 명령어를 이용하거나, PCAP 수집기로부터 데이터 스트림을 받을 수 있도록 logger 명령어를 이용하거나, 다른 데이터 스트림을 이용하도록 stream 명령어를 이용해 작성합니다. 그 외에도 PCAP 데이터를 전달하는 쿼리문이라면 무엇이든 사용할 수 있습니다.

설명

파이프(|)로 전달받은 데이터에서 HTTP 통신 헤더의 특정 필드 값을 디코딩합니다. 출력하는 필드는 다음과 같습니다.

사용 예

1) 임의의 PCAP 파일에서 HTTP 통신만 디코딩

pcapfile /opt/logpresso/pcap/abnormal_traffic.pcap | decodehttp

3.10decodesflowdecodesflow

PCAP 파일이나 sFLow 수집기에서 전달받은 데이터에서 sFlow 패킷을 디코딩해 보여줍니다. 패킷 단위로 디코딩하려면 pcapdecode 명령을 이용하세요.

문법

FORWARDING_STATEMENT | decodesflow
FORWARDING_STATEMENT

pcapfile 명령어를 이용하거나, PCAP 수집기로부터 데이터 스트림을 받을 수 있도록 logger 명령어를 이용하거나, 직접 데이터 스트림을 이용하도록 stream 명령어 등을 이용해서 작성합니다.

설명

출력하는 필드는 다음과 같습니다.

사용 예

pcapfile /home/logpresso/sonar/sflow.cap | decodesflow

3.11evaleval

우변의 표현식을 평가하여 새로운 필드를 할당하거나 기존의 필드 값을 대체합니다. 우변에는 값으로 평가될 수 있는 모든 조합의 표현식을 입력할 수 있습니다.

문법

eval FIELD=EXPR[, FIELD=EXPR, ...]
FIELD=EXPR[, FIELD=EXPR, ...]

표현식을 새 필드 또는 기존 필드에 할당하는 구문을 입력합니다. 필드와 표현식 쌍을 여러 개 지정하려면 구분자로 쉼표(,)를 사용합니다. 여러 개의 FIELD=EXPR 쌍이 있으면 왼쪽부터 순서대로 평가합니다.

사용 예

1) 'int("100")' 함수를 실행해 문자열을 정수로 변환한 다음 'num' 필드에 할당

eval num = int("100")

2) ‘typeof()' 함수를 호출해 특정 필드의 타입을 'type' 필드에 할당

eval type = typeof("string")
eval type = typeof(100)

3) 필드 값 합산

eval total = sent + rcvd

4) 'concat("hello", ", world")' 함수를 실행한 결과를 'msg' 필드에 할당

eval msg = concat("hello", ", world")

3.12evalcevalc

우변의 표현식을 평가하여 새로운 쿼리 매개변수를 할당하거나 기존의 쿼리 매개변수 값을 대체합니다. set 쿼리 명령어와 다르게 입력되는 쿼리 실행 시점에 모든 데이터에 대해 평가됩니다. 우변에는 값으로 평가될 수 있는 모든 조합의 표현식을 입력할 수 있습니다.

문법

evalc VAR=EXPR
VAR=EXPR

VAR는 새 매개변수 또는 기존 매개변수 이름을 지정합니다. 값으로 평가될 수 있는 모든 조합의 표현식을 매개변수에 할당할 수 있습니다.

사용 예

1) count가 임계치가 넘는 경우 alert 값을 true로 설정

evalc alert = if(count > 100000, true, $("alert"))

모든 입력 데이터에 대해 우변 표현식 평가 후 대입되므로, 임계치를 넘지 않는 경우 $ 함수를 이용하여 기존 변수 값을 그대로 다시 대입하도록 해야합니다.

3.13explodeexplode

지정된 배열의 각 원소마다 대응되는 행을 생성합니다. 일반적으로 배열(가로)을 열(세로) 방향으로 축 변환하려는 경우에 사용합니다. 지정된 필드가 존재하지 않거나, 배열이 아니거나, null인 경우 입력 행을 보존합니다.

문법

explode FIELD
FIELD

배열을 포함하는 필드의 이름을 지정합니다.

사용 예

1) IP 통계 추출

json "[{line: '10.0.0.1 10.0.0.2'},{line:'10.0.0.2 10.0.0.3'}]" 
| eval ip = split(line, " ") 
| explode ip 
| stats count by ip
  1. eval 명령어로 split() 함수를 사용하면 1행은 ["10.0.0.1", "10.0.0.2"], 2행은 ["10.0.0.2", "10.0.0.3"] 인 배열을 ip 필드에 할당합니다.

  2. explode 명령은 ip 필드의 배열 요소 개수만큼 4개의 행을 생성합니다.

  3. 최종적으로 stats 명령어는 ip 필드를 기준으로 10.0.0.1, 10.0.0.2, 10.0.0.3count() 함수를 호출해 IP 주소별 개수를 출력합니다.

3.14fieldsfields

특정한 필드만 출력하거나, 특정한 필드만 선택적으로 제외합니다. - 부호를 사용한 경우에는 뒤에 나열되는 필드만 제거하고, - 부호가 생략된 경우에는 뒤에 나열되는 필드만 출력합니다.

문법

fields [-] FIELD_1[, FIELD_2, ...]
-

'-'를 사용하면 뒤에 열거한 필드들을 출력에서 생략합니다. 이 부호를 생략하면 뒤에 열거한 필드(들)만 출력합니다.

FIELD_1[, FIELD_2, ...]

필드 목록을 지정합니다. 구분자로 쉼표(,)를 사용합니다.

사용 예

1) 'src_ip'와 'action' 필드만 출력

fields src_ip, action

2) line 필드만 제거

fields – line

3.15flowsearchflowsearch

서브쿼리로 정의된 IP 네트워크 대역, 포트, 프로토콜 조건으로 구성된 플로우 규칙을 읽어들여 입력 레코드와 대조하고, 검색된 모든 플로우 식별자를 _flow 필드에 배열로 출력합니다.

문법

flowsearch [ SUBQUERY ]
SUBQUERY

플로우 규칙을 정의하는 서브쿼리를 대괄호쌍([ ])으로 감싸서 입력합니다.

설명

플로우 규칙은 파일, 테이블, 원격 RDBMS 등 임의의 위치에서 읽어올 수 있으며, 필드 구성과 타입이 일치해야 유효한 규칙으로 인식합니다. 서브쿼리로 적용할 수 있는 플로우 규칙은 10,000개를 초과할 수 없습니다. 10,001번째 규칙부터는 무시합니다.

서브쿼리가 실패하면 _flowsearch_error 필드에 오류 원인을 출력합니다. flowsearch 명령문 뒤에 _flowsearch_error 필드 값이 존재하는지 검사하는 예외 처리문을 두면 의도하지 않은 오류 혹은 오동작을 방지할 수 있습니다.

표 3-1입력 레코드 필드 정의

필드 이름

타입

필수 여부

설명

src_ip

IP 주소

필수

출발지 IP 주소

src_port

정수

선택 (null 허용)

출발지 포트

dst_ip

IP 주소

필수

목적지 IP 주소

dst_port

정수

선택 (null 허용)

목적지 포트

protocol

문자열

선택 (null 허용)

프로토콜 문자열

입력 레코드의 필드가 타입이 일치하지 않거나 필수 필드가 누락된 경우에는, 플로우 규칙을 검사하지 않고 레코드를 원본 그대로 출력합니다.

표 3-2플로우 규칙 필드 정의

필드 이름

타입

필수 여부

설명

src_ip

IP 주소

필수

출발지 IP 주소

src_cidr

정수

필수

출발지 넷마스크

(0-32 범위의 정수)

src_port

정수

선택 (null 허용)

출발지 포트 번호

(0-65535 범위의 정수)

dst_ip

IP 주소

필수

목적지 IP 주소

dst_cidr

정수

필수

목적지 넷마스크

(0-32 범위의 정수)

dst_port

정수

선택 (null 허용)

목적지 포트 번호

(0-65535 범위의 정수)

protocol

문자열

선택 (null 허용)

프로토콜 문자열

(TCP, UDP, ICMP 등)

flow

임의 타입

필수

플로우 식별자

즉, flowsearch 커맨드에 레코드가 1개 입력될 때마다 입력된 5-튜플 값을 플로우 규칙과 대조하여, 일치하는 플로우 식별자를 _flow 필드에 목록으로 출력합니다.

플로우 규칙의 ipcidr 필드는 모두 필수 입력이지만, 규칙의 src_ip0.0.0.0 이고 src_cidr0인 경우 모든 출발지 IP 주소에 대해 참이 되므로, 출발지 혹은 목적지에 대해 모든 값을 허용하려면 규칙에 0.0.0.0/0을 설정하면 됩니다.

예를 들어 아래의 플로우 규칙에 대해, 입력 레코드가 src_ip=106.75.11.63, src_port=57776, dst_ip=106.246.20.67, dst_port=80, protocol=TCP 인 경우, flow2가 일치하므로 출력 레코드에는 _flow=["flow2"] 필드가 추가됩니다.

표 3-3플로우 규칙 예시

src_ip

src_cidr

src_port

dst_ip

dst_cidr

dst_port

protocol

flow

211.36.133.0

24

null

106.246.20.67

32

80

TCP

flow1

106.75.11.0

24

null

106.246.20.67

32

null

TCP

flow2

사용 예

json "{}"
| eval src_ip=ip("106.75.11.63"),
     src_port=57776 
| eval dst_ip=ip("106.246.20.67"),
     dst_port=80, protocol="TCP" 
| # 플로우 검색 규칙을 정의하는 flowsearch 명령문 시작 
| flowsearch [
  union [
    json "{}" 
    | eval src_ip=ip("211.36.133.0"),
         dst_ip=ip("106.246.20.67"),
         flow="flow1"
  ] 
  | union [
    json "{}"
    | eval src_ip=ip("106.75.11.0"),
         dst_ip=ip("106.246.20.67"),
         flow="flow2"
  ]
  | eval src_cidr=24, dst_cidr=32
]
| fields src_ip, src_port, dst_ip, dst_port, protocol, _flow

3.16groovygroovy

Groovy로 작성된 스크립트를 실행합니다.

문법

FORWARDING_STATEMENT | groovy CLASS_NAME
FORWARDING_STATEMENT

로거, 테이블, 혹은 다른 스트림을 전달하거나, 파일을 읽어들여 출력하는 명령문으로, jsonfile, pcapfile, textfile, xmlfile, zipfile과 같이 파일에서 데이터를 가져오는 명령어를 이용하거나, 수집기로부터 데이터를 받을 수 있도록 logger 명령어를 이용하거나, 직접 데이터 스트림을 이용하도록 stream 명령어 등을 이용해서 작성합니다. 테이블에 입력되는 레코드를 행 단위로 읽어오도록 table 명령어를 시용할 수도 있습니다.

CLASS_NAME

실행할 클래스 이름을 지정합니다.

설명

Groovy는 Python, Ruby와 같은 언어의 영향을 받아 개발된 동적 객체 지향 언어로 JVM에서 동작합니다. 로그프레소 Java SDK를 활용해 스크립트를 작성하고 실행할 수 있습니다. 로그프레소 Java SDK는 다음 경로에서 확인할 수 있습니다: https://github.com/logpresso/logpresso-sdk-java

실행할 수 있는 스크립트 파일은 다음과 같은 제약 조건을 만족해야 합니다.

Groovy 스크립트의 성능을 향상시키려면 다음과 같은 사항을 참고하세요.

사용 예

다음과 같은 스크립트를 ToAscii.groovy라는 이름으로 저장합니다.

import groovy.transform.CompileStatic;
import org.araqne.logdb.Row;
import org.araqne.logdb.groovy.GroovyQueryScript;

@CompileStatic
class ToAscii extends GroovyQueryScript {
  def void onRow(Row row) {
    byte[] payload = row.get('payload')

    char[] chars = new char[payload.length];
    for (int i = 0; i < payload.length; i++) {
      char c = (char) payload[i]
      if (c < 32 || c > 126)
        c = '.'
      chars[i] = c 
    }

    row.put('text', new String(chars))
    pipe.onRow(row)
  }
}

이 스크립트는 PCAP 파일에서 디코딩되어 payload 필드에 출력된 바이너리 값 중에서 32번째 문자부터 127번째 문자를 ASCII 형식으로 인코딩해서 보여줍니다.

pcapfile /home/logpresso/sonar/http-2.pcap | pcapdecode | groovy ToAscii

3.17kmeanskmeans

유클리디안 거리를 기반으로 입력 레코드를 K개의 클러스터로 분류합니다.

문법

kmeans [k=NUM] [iter=NUM] FIELD_1[, FIELD_2, ...]
k=NUM

클러스터 수를 지정합니다. 지정하지 않으면 기본값인 3을 적용합니다.

iter=NUM

계산 반복 횟수를 지정합니다. 지정하지 않으면 기본값인 10000을 적용합니다.

FIELD_1[, FIELD_2, ...]

계산 대상 필드 이름을 지정합니다. 필드 값은 숫자형이어야 하며, 지정된 필드 값이 숫자가 아닌 입력 레코드는 무시됩니다. 최대 1만개의 입력 레코드를 허용하며, _cluster 필드에 1부터 증가하는 번호로 클러스터를 분류하여 출력합니다. 유효 입력 레코드가 1만개를 넘으면 쿼리를 종료합니다.

사용 예

1) iris 데이터 분류

머신 러닝에서 흔히 인용되는 iris 데이터를 이용하여 시험할 수 있습니다. 길이와 너비를 이용하여 분류를 수행한 후, 실제 종(species) 이름과 비교해봅니다(다운로드: https://github.com/illinois-cse/data-fa14/blob/gh-pages/data/iris.csv).

csvfile /home/logpresso/iris.csv
| eval
  sepal_length = double(sepal_length), sepal_width = double(sepal_width)
| kmeans k=4 iter=100000 sepal_length, sepal_width

3.18limitlimit

지정한 개수만큼 특정 위치에서 쿼리 결과를 읽어오고, 쿼리를 취소합니다.

문법

limit [NUM_TO_SKIP] NUM

NUM_TO_SKIP

지정한 개수만큼 쿼리 결과에서 앞부분 N개를 건너뜁니다. 생략하면 0으로 지정됩니다.

NUM

쿼리 결과에서 가져올 최대 개수를 지정합니다. 지정한 쿼리 입력 개수에 도달하면 쿼리를 취소합니다. 일부 명령어는 쿼리가 취소되면 의도한대로 동작하지 않을 수 있으므로 주의해야 합니다.

사용 예

1) 가장 먼저 입력으로 들어오는 5건만 조회하고 쿼리 취소

table sys_cpu_logs | limit 5
위에 예로 든 쿼리문은 다음과 동일한 결과를 갖습니다:
table limit=5 sys_cpu_logs

2) 첫번째 레코드는 제외하고 2건만 조회한 후 쿼리 취소

table sys_cpu_logs | limit 1 2
위에 예로 든 쿼리문은 다음과 동일한 결과를 갖습니다:
table offset=1 limit=2 sys_cpu_logs

3.19mpsearchmpsearch

수천 개 이상의 키워드 패턴을 고속으로 한 번에 검색합니다. 서브쿼리에서 지정된 패턴이 검색 대상 필드에서 검출되면, _mp_result 필드에 검출된 모든 패턴 목록을 포함하여 출력합니다.

문법

mpsearch FIELD [ SUBQUERY ]
FIELD

멀티 패턴을 검색할 대상 필드의 이름을 지정합니다.

SUBQUERY

검색할 키워드 패턴의 목록을 조회하는 서브쿼리를 대괄호쌍([ ])으로 감싸서 입력합니다.

설명

서브쿼리의 출력은 expr, expr2, rule 문자열 필드를 포함해야 합니다.

패턴의 예시는 아래와 같습니다:

표 3-4패턴 예시

expr (필수)

expr2 (선택)

rule (필수)

키워드 패턴: 1차 고속 탐지

불린 표현식: 2차 필터링

패턴 이름

"addextendedproc" and "xp_cmdshell"


xp_cmdshell

"REMOTE_ADDR" and ("fputs" or "fwrite")

path == "lib.php"

zb now_connect

만약 xp_cmdshell 패턴만 탐지되었다면, _mp_result 필드의 값은 아래와 같습니다:

[ { "expr": "\"addextendedproc\" and \"xp_cmdshell\"", "rule": "xp_cmdshell" } ]

사용 예

1) 외부 DB에서 패턴 목록을 로딩하여 signature 필드를 대상으로 멀티 패턴매칭

mpsearch signature [ 
    dbquery RULE_DB select rule, expr, expr2 from web_rules ]

3.20orderorder

order 명령어는 ENT #1660 2017-07-19_00-18 일자 버전부터 지원합니다.

출력할 특정한 필드를 지정한 순서로 정렬하고 나머지 필드는 사전순으로 정렬해서 표시합니다.

문법

order FIELD_1[, FIELD_2, ...]

FIELD_1[, FIELD_2, ...]

순서를 지정할 필드 이름을 순서대로 열거합니다. 구분자로 쉼표(,)를 사용합니다. 여기에 열거하지 않은 필드는 사전순으로 정렬합니다.

사용 예

1) sys_cpu_logs 테이블의 필드 출력 순서를 kernel, idle, user, _time, _table, _id 순서로 정렬

table sys_cpu_logs | order kernel, idle, user, _time, _table, _id

2) sys_cpu_logs 테이블의 필드 출력 순서를 idle, kernel을 가장 먼저 출력하고 나머지는 사전순으로 정렬

table sys_cpu_logs | order idle, kernel

3.21parallelparallel

서브쿼리를 사용하여 입력 데이터를 병렬로 처리하고, 각 서브쿼리 결과를 합쳐서 전달합니다.

문법

parallel core=NUM [ SUBQUERY ]
core=NUM

서브쿼리의 병렬 처리에 사용할 CPU의 논리 코어 개수

SUBQUERY

병렬로 처리할 서브쿼리문

사용 예

먼저 테스트용 데이터 테이블 생성을 생성합니다.

json "{}" 
| repeat count=5000000
| set a=0 | evalc a=$("a") + 1
| eval b=$("a")
| fields b
| import create=t big_table

병렬로 서브 쿼리를 실행합니다.

table big_table 
| parallel core=4 [eval i=int(b)] 
| stats count by b | sort -count

3.22parseparse

입력 데이터에 특정 파서를 지정하거나, 파싱 규칙을 지정해 출력합니다.

문법

parse [overlay=t] PARSER

또는

parse [overlay=t] [field=TARGET_FIELD] "STR_BEGIN*STR_END" as LABEL_1[, "STR_BEGIN*STR_END" as LABEL_2, ...]
overlay=t

't'로 설정하면 필드의 원래 값 대신에 파싱한 값으로 덧씌워 출력하고 원본 데이터를 보존합니다. 이 옵션을 지정하지 않거나, 'f'로 설정하면 파서가 반환하는 필드만 출력으로 내보냅니다.

field=TARGET_FIELD

입력으로 받는 데이터 스트림에서 파싱할 대상이 되는 필드를 지정합니다. 지정하지 않으면 line 필드에 파싱한 레코드를 기록합니다. line 필드는 입력으로 전달받은 원본 데이터를 저장하는 기본 필드입니다. 이 옵션을 파서(PARSER)와 함께 사용할 수 없습니다.

PARSER

입력 데이터에 적용할 파서를 지정합니다. 파서를 지정하면 파서가 출력할 필드가 이미 정의되어 있으므로 field=TARGET_FIELD 옵션을 함께 사용할 수 없습니다.

"STR_BEGIN*STR_END" as LABEL_1[, "STR_BEGIN*STR_END" as LABEL_2, ...]

시작 문자열과 끝 문자열을 지정하여 필드를 식별해 파싱하도록 규칙을 입력합니다. as 지시자 앞에 필드 식별 문자열을, 뒤에 사용할 필드 이름을 지정합니다. 여러 개의 규칙을 열거할 때 구분자로 쉼표(,)를 사용합니다.

사용할 수 있는 파서의 이름은 웹 콘솔에서 확인할 수 있습니다.
- (STD, ENT) 시스템 설정 > 파서/트랜스포머 > 파서에서 이름 필드 확인
- (SNR) 수집 > 원본 로그 파서, 정규화 파서에서 파서 식별자 필드 확인

사용 예

1) openssh 파서를 이용해 ssh_log 테이블에 저장된 로그를 파싱

table from=20200601 to=20200701 ssh_log | parse openssh

2) 로그에서 시작과 끝 텍스트를 지정하여 필드 추출(다음 내용을 'sample.txt'로 저장해서 사용)

Nov 11 00:00:00 session: Proto:17, Policy:pass, Rule:9000, Type:open, Start_Time:Nov 11 00:00:00, End_Time:-

아래 명령으로 위와 같은 원본에서 session, proto, policy, rule, end_time 필드를 추출할 수 있습니다.

textfile /home/logpresso/sample.txt 
| parse "session:* " as session,
      "Proto:*," as proto,
      "Policy:*," as policy,
      "Rule:*," as rule,
      "Start_Time:*," as start_time,
      "End_Time:*" as end_time

3.23parsecsvparsecsv

CSV(comma-separated value) 또는 TSV(tab-separated value) 문자열을 파싱합니다.

문법

parsecsv [overlay=t] [strict=t] [tab=t] [field=TARGET] [FIELD_1, FIELD_2, ...]
overlay=t, overlay=true

't'나 'true'로 설정하면 필드의 원래 값 대신에 파싱한 값으로 덧씌워 출력하고 원본 데이터를 보존합니다. 이 옵션을 지정하지 않거나, 'f', 'false'로 설정하면 파서가 반환하는 필드만 출력으로 내보냅니다.

strict=t, strict=true

't'나 'true'로 설정하면 RFC 4180을 엄격하게 적용하여 CSV 파일을 파싱합니다. 엑셀로 CSV 파일을 열었을 때의 파싱 동작과 같습니다. 이 옵션을 지정하지 않거나, 'f', 'false'로 CSV 파일을 유연하게 파싱합니다. 동작의 차이는 csvfile 명령어의 strict 옵션 설명을 참조하세요.

tab=t

't'나 'true'로 설정하면 Tab 문자를 구분자로 인식합니다. TSV(Tab-separated Values) 파일을 처리할 때 유용합니다(기본값: f).

field=TARGET

지정된 입력 필드의 값을 파싱합니다. 지정하지 않으면 line 필드를 대상으로 파싱합니다.

[FIELD_1, FIELD_2, ...]

파싱된 필드에 사용할 이름을 지정합니다. 필드 이름 구분자로 쉼표(,)를 사용합니다. 필드 이름을 지정하지 않으면 이름을 순서대로 column0, column1, ..., colnumnN으로 부여합니다.

사용 예

1) 쉼표로 구분된 텍스트 파싱

json "{line: '\"foo\",\"bar\"'}" | parsecsv

2) 쉼표로 구분된 텍스트를 파싱하여 앞에서부터 순서대로 name1, name2 필드 이름을 부여

json "{line: '\"foo\",\"bar\"'}" | parsecsv name1,name2

3.24parsejsonparsejson

JSON 문자열을 파싱합니다.

문법

parsejson [overlay=t] [field=TARGET]
overlay=t, overlay=true

't'나 'true'로 설정하면 필드의 원래 값 대신에 파싱한 값으로 덧씌워 출력하고 원본 데이터를 보존합니다. 이 옵션을 지정하지 않거나, f, false로 설정하면 파서가 반환하는 필드만 출력으로 내보냅니다.

field=TARGET

지정된 입력 필드의 값을 파싱합니다. 지정하지 않으면 line 필드를 대상으로 파싱합니다.

사용 예

1) line 필드의 JSON 텍스트를 파싱

json "{line: ' {\"foo\": \"bar\"}'}" | parsejson

3.25parsekvparsekv

키와 값의 쌍으로 이루어진 문자열을 파싱합니다.

문법

parsekv [field=TARGET] [kvdelim="CHAR"] [overlay=t] [pairdelim="CHAR"]
field=TARGET

지정된 입력 필드의 값을 파싱합니다. 지정하지 않으면 line 필드를 대상으로 파싱합니다.

kvdelim="CHAR"

키/값 구분자로 사용할 문자를 지정합니다. 지정하지 않으면 할당 연산자(=)를 사용합니다.

overlay=t, overlay=true

ttrue로 설정하면 필드의 원래 값 대신에 파싱한 값으로 덧씌워 출력하고 원본 데이터를 보존합니다. 이 옵션을 지정하지 않거나, f, 또는 false로 설정하면 파서가 반환하는 필드만 출력으로 내보냅니다.

pairdelim="CHAR"

필드 구분자로 사용할 문자를 지정합니다. 지정하지 않으면 공백 문자( )를 사용합니다.

사용 예

1) line 필드의 JSON 문자열을 키/값 쌍으로 변환

json "{line: 'src=1.2.3.4 src_port=55324 dst=5.6.7.8 dst_port=80'}" | parsekv

3.26parsemapparsemap

지정한 대상 필드의 값이 키/값으로 구성되는 맵인 경우, 해당 맵의 모든 키를 필드로 변환하여 값을 보여줍니다.

문법

parsemap [overlay=t] field=TARGET
overlay=t, overlay=true

ttrue로 설정하면 원본 필드에 맵으로 값을 덧씌워 출력하고 원본 데이터를 보존합니다. 이 옵션을 지정하지 않거나, f, 또는 false로 설정하면 맵을 파싱한 결과만 출력으로 내보냅니다.

field=TARGET

지정된 입력 필드의 값을 파싱합니다. 지정하지 않으면 line 필드를 대상으로 파싱합니다. 대상 필드는 맵 타입이어야 합니다. 대상 필드의 값이 null이거나, 맵 타입이 아니라면, 원본 데이터를 그대로 전달합니다. 대상 필드를 지정하지 않으면 line 필드에 파싱한 레코드를 기록합니다.

사용 예

1) 'complex' 필드의 모든 키/값 쌍을 맵 필드로 추출

json "{'complex': {'id':100, 'name':'Logpresso'} }" | parsemap field=complex

3.27parsexmlparsexml

XML 문서를 복합 객체의 집합으로 파싱합니다.

문법

parsexml [field=TARGET] [overlay=t]
field=TARGET

지정된 입력 필드의 값을 파싱합니다. 지정하지 않으면 line 필드를 대상으로 파싱합니다.

overlay=t, overlay=true

ttrue로 설정하면 필드의 원래 값 대신에 XML에서 파싱한 값으로 덧씌워 출력하고 원본 데이터를 보존합니다. 이 옵션을 지정하지 않거나, f, 또는 false로 설정하면 XML 문자열을 파싱한 결과만 출력으로 내보냅니다.

사용 예

루트 XML 요소에 속한 하위 XML 요소를 필드로 추출합니다.

예를 들어, <doc><id>sample</id></doc> 형태의 XML을 파싱하면 id 필드에 sample 문자열 값이 할당됩니다.

<doc><id>sample</id><name locale="ko">로그프레소</name></doc> 형태의 XML이라면 name 필드에는 {"locale":"ko","_text":"로그프레소"}와 같이 locale=ko, _text=로그프레소 이렇게 2개의 키/값 맵이 할당됩니다. parsemap 명령어를 조합하면 복합 객체 안에 있는 맵에서 쉽게 필드를 추출할 수 있습니다.

json
  "{line: '<doc><id>sample</id><name locale="ko">로그프레소</name></doc>'}" 
| parsexml 
| parsemap field=name overlay=t

3.28pcapdecodepcapdecode

PCAP 파일을 디코딩해 결과를 출력합니다.

문법

FORWARDING_STATEMENT | pcapdecode
FORWARDING_STATEMENT

pcapfile 명령어를 이용하거나, PCAP 수집기로부터 데이터 스트림을 받을 수 있도록 logger 명령어를 이용하거나, 직접 데이터 스트림을 이용하도록 stream 명령어 등을 이용해서 작성합니다. PCAP 데이터를 전달할 수 있는 어떤 쿼리 명령문이든 사용할 수 있습니다.

PCAP 수집기로는 DNS 스니퍼, HTTP 스니퍼, PCAP 디렉터리 와처, PCAP 패킷 수집기가 있습니다. 자세한 내용은 로그프레소 UI 매뉴얼을 참조하세요.

사용 예

pcapfile /home/logpresso/http-2.pcap | pcapdecode

3.29pcapreplaypcapreplay

지정한 PCAP 송수신 장치를 통해 PCAP 파일로 저장된 통신을 재현합니다. 이 명령어를 실행하려면 관리자 권한이 필요합니다. 인입된 트래픽을 IPS나 네트워크 통신 분석 장비의 모니터 포트로 전송하는 방식으로 응용해 사용할 수 있습니다.

문법

PCAP_FORWARDING_STATEMENT | pcapreplay device="DEVICE_NAME" [pps=PPS_NUM]
PCAP_FORWARDING_STATEMENT

pcapfile 명령어를 이용하거나, PCAP 수집기로부터 데이터 스트림을 받을 수 있도록 logger 명령어를 이용하거나, 테이블에 저장된 PCAP 페이로드를 읽어들이도록 table 명령어를 이용하거나, 직접 데이터 스트림을 이용하도록 stream 명령어 등을 이용해서 작성합니다.

DEVICE_NAME

system pcapdevices 명령으로 식별된 디바이스 중에서 통신 패킷을 재현할 인터페이스를 지정합니다. 인터페이스를 지정하려면 name으로 식별되는 디바이스의 이름을 지정합니다.

PPS_NUM

재현할 때 적용할 패킷 전송 속도를 PPS(packets per second) 단위로 지정합니다.

이 명령어가 동작하려면 로그프레소를 운영하는 시스템에 libpcap이나 winpcap과 같은 드라이버가 설치되어 있고, 로그프레소 프로세스가 네트워크 인터페이스에 대해 RAW I/O를 관리자 권한으로 사용할 수 있어야 합니다.
테이블에 저장된 패킷 데이터를 재현하려면 table 명령에 order=asc 옵션을 적용해 패킷을 원래의 시간 순서대로 정렬해야 합니다.

사용 예

1. 최근 5분간 tapped_traffic 테이블에 저장된 레코드에서 payload 필드를 읽어온 후 PCAP 송수신 장치 "enp0s3"에서 1,302,083 pps (약 1Gbps에 해당) 속도로 트래픽을 전송

set from = string(dateadd(now(), "min", -5), "yyyyMMddHHmmss") 
| set to = string(now(), "yyyyMMddHHmmss") 
| table order=asc from=$("from") to=$("to") tapped_traffic 
| fields payload 
| pcapreplay device="enp0s3" pps=1302083

3.30pivotpivot

그룹 함수를 실행해 피봇을 실행한 결과를 출력합니다.

문법

pivot [parallel=t] GRP_FUNCTION() [as LABEL_1][, GRP_FUNCTION() [as LABEL_2], ...] [by|rows FIELD_1, FIELD_2, ...] [for|cols FIELD_1, FIELD_2, ...]
parallel=t

ttrue로 설정하면 쿼리를 병렬로 처리합니다. 처리 속도는 증가하지만 데이터의 순서를 보장하지 않습니다. 데이터의 순서가 중요한 쿼리문에서는 이 옵션을 사용하지 마십시오. 이 옵션을 지정하지 않거나, ffalse로 설정하면 병렬 처리를 하지 않습니다.

GRP_FUNCTION() [as LABEL_1][, GRP_FUNCTION() [as LABEL_2], ...]

실행할 집계 함수를 이용해 표현식을 입력합니다. as 문을 이용해 집계 함수 결과 값 필드에 사용할 필드 이름을 지정할 수 있습니다. 이름을 지정하지 않으면 count(), sum(sent_pkts)과 같이 함수 이름을 필드 이름으로 사용하므로 필드 이름을 지정하는 것이 좋습니다.

[by|rows FIELD_1, FIELD_2, ...]

by 또는 rows 지시자와 함께 필드를 지정하면 필드의 값을 단위로 하여 그룹 함수를 적용합니다.

[for|cols FIELD_1, FIELD_2, ...]

by 또는 rows 지시자로 지정한 필드에 대해 for 또는 cols 지시자로 지정된 필드 값을 단위로 하여 그룹 함수를 적용합니다.

{by|rows} 절이나 {for|cols} 절이 지정되지 않은 경우 이전 쿼리 명령어에서 넘어오는 전체 로그를 하나의 그룹으로 계산합니다. 그룹 필드를 기준으로 정렬되는 부수적인 효과가 있습니다.

사용 예

1) count() 함수를 호출해 전체 행 개수를 계산

pivot count

2) count() 함수를 호출해 src_ip 필드 값의 고유 항목 당 계수

pivot count by src_ip

3) count() 함수를 호출하여 src_ipdst_ip 필드에 대해 protocol 필드 값(예: TCP, UDP, ICMP)별로 행 개수를 계산

pivot count by src_ip, dst_ip for protocol

4) src_ipdst_ip 필드에 대해 protocol 필드 값(예: TCP, UDP, ICMP)별로 행 개수(count() )와 트래픽 용량(sum(bytes))을 계산

pivot sum(bytes) as bytes, count rows src_ip, dst_ip cols protocol

3.31prevprev

입력 데이터 스트림에서 지정된 필드(예: count)를 조회하고, 다음 입력 레코드에 직전 레코드의 필드 값을 접두사 prev_가 붙은 필드(예: prev_count)에 추가합니다. 이 명령어는 주로 데이터의 변화량을 추출하는 용도로 사용됩니다.

문법

prev INPUT_FIELD_1[, INPUT_FIELD2, ...]
INPUT_FIELD_1[, INPUT_FIELD2, ...]

이전 값을 추적할 필드를 지정합니다. 하나 이상 필드를 지정하려면 구분자로 쉼표(,)를 사용합니다. 지정된 필드에 대해 이전 값을 저장하는 필드(접두사로 prev_가 추가된 필드)에 이전 레코드의 값을 저장합니다.

사용 예

1) 1분 단위로 GC 횟수의 변화량 계산

table sys_gc_logs 
| timechart span=1m count 
| prev count 
| eval delta = count - prev_count

2) GC 발생 간격이 10초 이내인 GC 로그 조회

table order=asc sys_gc_logs 
| prev _time 
| eval interval = datediff(prev__time, _time, "sec") 
| search interval < 10

3.32renamerename

원본 필드 이름을 as 뒤에 지정된 필드 이름으로 변경합니다.

문법

rename FIELD_NAME as NEW_NAME
FIELD_NAME

원본 필드의 이름

NEW_NAME

새로 사용할 필드 이름

사용 예

1. 'src_ip' 필드 이름을 Source로 변경

rename src_ip as Source

3.33repeatrepeat

지정한 숫자만큼 결과를 반복합니다. 이 명령은 반복 순서를 보장하지 않습니다. 각 로우별로 반복되는 경우도 있고 전체 집합별로 반복되는 경우도 있습니다.

문법

repeat count=NUM
count=NUM

지정한 횟수만큼 결과를 반복해서 보여줍니다.

사용 예

1) 최근 CPU 사용률 10건을 3번씩 표시

table limit=10 sys_cpu_logs | repeat count=3

2) 임의의 데이터 100건 생성

json "{}" | repeat count=100
| eval seq=seq() 
| eval rand_value=rand(100)

3.34rexrex

지정된 필드에서 정규표현식을 이용하여 필드를 추출합니다.

문법

rex field={FIELD|line} "REGEX"
field={FIELD|line}

정규 표현식을 이용하여 문자열을 추출할 대상 필드를 지정합니다. 필드를 특정하지 않으려면 line을 입력하세요.

"REGEX"

필드 이름을 부여할 수 있도록 확장된 정규표현식을 입력합니다. 정규표현식 그룹을 만들 때 (?<field>.*) 형식으로 지정하면 그룹에 매칭된 문자열을 field 필드에 출력합니다.

사용 예

1. line 필드에서 GET 또는 POST 메서드를 이용해 /game/flash/로 시작하는 경로의 파일에 접근한 이력을 검색해 매칭된 문자열을 filename 필드에 출력

rex field=line "(GET|POST) /game/flash/(?<filename>([^ ]*))"

2. line 필드에서 타임스탬프 패턴의 문자열을 추출해 timestamp 필드에 출력

rex field=line "(?<timestamp>\d+-\d+-\d+ \d+:\d+:\d+)"

3. line 필드에서 urlquerystring 동시에 검색해 출력

rex field=line "(GET|POST) (?<url>[^ ]*) (?<querystring>[^ ]*) "

3.35rolluprollup

rollup 명령어는 ENT #1804 2017-11-28_13-31 일자 버전부터 지원합니다.

그룹 함수를 사용할 때 항목별 합계를 출력합니다. by 절에 여러 필드가 있을 경우 필드 순서대로 합계값을 표시합니다.

문법

rollup [label=FIELD] GRP_FUNCTION() [as LABEL_1][, GRP_FUNCTION() [as LABEL_2], ...] [by FIELD_1, FIELD_2, ...]
label=FIELD

집계값에 부여할 필드 이름을 지정합니다. 설정하지 않으면 null로 표시합니다.

GRP_FUNCTION() [as LABEL_1][, GRP_FUNCTION() [as LABEL_2], ...]

실행할 집계 함수와 집계 함수 결과 값 필드에 사용할 필드 이름을 지정합니다. 이름을 지정하지 않으면 count(), sum(sent_pkts)과 같이 함수 이름을 필드 이름으로 사용하므로 필드 이름을 지정하는 것이 좋습니다.

[by FIELD_1, FIELD_2, ...]

by 지시자와 함께 필드를 지정하면 필드의 값을 단위로 하여 그룹 함수를 적용합니다.

사용 예

1) action 필드별 계수 및 전체 계수

rollup count by action

2) action, status 필드별 계수와 size 합계 및 action 필드별 계수와 size 합계 (라벨은 "TOTAL"로 표시)

rollup label=TOTAL count, sum(size) as size by action, status

3.36searchsearch

조건 표현식에 따라 입력으로 받는 데이터를 검색합니다.

문법

search [limit=NUM] EXPR
limit=NUM

검색할 최대 레코드 개수를 입력합니다. 주어진 개수만큼 표현식이 참이 되면 쿼리를 완료합니다.

EXPR

검색 조건을 표현식 형태로 입력합니다. 예를 들어, "KEY == VALUE" 또는 "KEY != VALUE" 형태의 비교 조건식, 또는 불리언 조건식을 입력할 수 있습니다. and, or, not과 같은 논리 연산자를 이용해 조건식을 연결할 수 있습니다.

설명

search 명령은 데이터를 입력받아 지정된 표현식에 일치하는 데이터만 걸러내어 다른 쿼리 명령문에 전달하는 역할을 합니다. 표현식이 참인 경우에만 로그가 다음 쿼리 명령어로 전달됩니다.

사용 예

1) line 필드에 game 문자열을 포함하는 로그 (와일드카드 지원)

search line == "*game*"

2) 상태 코드가 200이 아닌 로그

search status != 200

3) src_ip가 1.2.3.4 이고 dst_port가 22인 경우

search src_ip == "1.2.3.4" and dst_port == 22

3.37serialserial

순서가 중요한 명령문을 실행할 수 있도록 입력을 튜플 단위로 직렬화하여 실행하고, 서브쿼리 결과를 합쳐서 전달합니다.

문법

serial [ STREAM_QUERIES_SEPARATED_BY_PIPES ]
STREAM_QUERIES_SEPARATED_BY_PIPES

스트림을 처리할 수 있는 명령어로 구성된 서브쿼리문을 입력합니다.

사용 예

1) 테이블 쿼리 후 행 단위로 CEP 함수(evtctxgetvar(), evtctxsetvar()) 적용

table iis 
| # cep 함수 쿼리문을 직렬화 실행 
| serial [
  search cs_uri_stem == "*game*" 
  | evtctxadd topic=TEST key=cs_uri_stem maxrows=0 true
  | eval prev_ip = evtctxgetvar("TEST", cs_uri_stem, "prev_ip")
  | eval _dummy = evtctxsetvar("TEST", cs_uri_stem, "prev_ip", c_ip)
]
| fields _time, cs_method, prev_ip, c_ip, cs_uri_stem, cs_uri_query

3.38signaturesignature

line 필드로부터 특수문자의 집합으로 구성된 시그니처를 추출합니다. 보통 파서를 개발하기 전에 패턴 유형별 로그 샘플을 추출하기 위한 용도로 사용합니다.

문법

signature

사용 예

1) 각 시그니처별 첫번째 샘플 로그 추출

signature | stats first(line) by signature

3.39sortsort

필드를 주어진 순서와 차순에 따라 정렬해서 출력합니다.

문법

sort [limit=NUM] [-]FIELD_1[, [-]FIELD_2, ...] [by PARTITION_FIELD_1[, PARTITION_FIELD_2, ...]
limit=NUM

정렬된 검색 결과에서 추출할 레코드 개수를 입력합니다.

[-]FIELD_1[, [-]FIELD_2, ...]

출력할 필드의 순서 및 순차를 지정합니다. 필드의 구분자로 쉼표(,)를 사용합니다. 필드의 기본 차순은 오름차순입니다. 내림차순으로 정렬하려면 이름 앞에 ''를 붙입니다.

[by PARTITION_FIELD_1[, PARTITION_FIELD_2, ...]

파티션 필드 값을 기준으로 파티셔닝 후 파티션별 정렬을 수행합니다. limit 옵션과 by 문을 같이 사용할 경우, 각 파티션마다 N개를 추출합니다.

사용 예

1) count 기준으로 상위 10개 내림차순 추출

sort limit=10 -count

2) bytespkts 기준으로 상위 10개 내림차순 추출

sort limt=10 -bytes, -pkts

3) 각 srcdst에 대해 bytespkts 기준으로 상위 10개 내림차순 추출

sort limt=10 -bytes, -pkts by src, dst

3.40statsstats

그룹을 대상으로 동작하는 집계 함수의 평가 결과를 출력합니다.

문법

stats [parallel=t] GRP_FUNCTION() [as LABEL_1][, GRP_FUNCTION() [as LABEL_2], ...] [by FIELD_1, FIELD_2, ...]
parallel=t

ttrue로 설정하면 쿼리를 병렬로 처리합니다. 처리 속도는 증가하지만 데이터의 순서를 보장하지 않습니다. 데이터의 순서가 중요한 쿼리문에서는 이 옵션을 사용하지 마십시오. 이 옵션을 지정하지 않거나, ffalse로 설정하면 병렬 처리를 하지 않습니다.

GRP_FUNCTION() [as LABEL_1][, GRP_FUNCTION() [as LABEL_2], ...]

실행할 집계 함수를 이용해 표현식을 입력합니다. as 절을 이용해 집계 함수 필드에 필드 이름을 지정할 수 있습니다. 이름을 지정하지 않으면 count(), sum(sent_pkts)과 같이 함수 이름을 필드 이름으로 사용하므로 필드 이름을 지정하는 것이 좋습니다.

[by FIELD_1, FIELD_2, ...]

by 절을 이용해 그룹화할 필드를 지정하면 필드 값을 단위로 하여 그룹 함수를 적용합니다. by 절을 지정하지 않으면 이전 쿼리 명령어에서 넘어오는 전체 로그를 하나의 그룹으로 계산합니다. 그룹 필드를 기준으로 정렬되는 부수적인 효과가 있습니다.

사용 예

1) 전체 레코드 합계 계산하기

stats count

2) src_ip 필드 값별로 레코드 합계 계산하기

stats count by src_ip

3) src_ipdst_ip 필드 쌍으로 그룹화하여 레코드 합계 계산하기

stats count by src_ip, dst_ip

4) src_ipdst_ip 필드 쌍으로 그룹화하여 sum(bytes)count() 계산하기

stats sum(bytes) as bytes, count by src_ip, dst_ip

3.41stlstl

시계열 데이터를 추세(trend), 계절적 변동(seasonality), 잔차(error)로 분해합니다. stl 쿼리 결과는 파티션 필드(by 절로 지정한 필드) 별로 최대 1000건 출력되며, 파티션 필드를 지정하지 않은 경우 전체 결과는 1000건으로 제한됩니다.

stl 출력 제한 건수를 늘리고 싶으면 -Dlogpresso.stl.limit=N 부팅 옵션을 추가하여 원하는 값을 입력하면 됩니다.

문법

stl [period=NUM{y|mon|w|d|h|m|s}] NUMERIC_FIELD [by FIELD]
period=NUM{y|mon|w|d|h|m|s}

시계열 주기를 지정합니다. s(초), m(분), h(시), d(일), w(주), mon(월), y(연) 단위로 지정할 수 있습니다. 지정한 주기에 따라 시계열 데이터가 반복성을 갖는다고 가정하고 분석합니다. 시계열 주기를 지정하지 않으면 스펙트럼 분석을 통해 자동으로 계절변동 주기를 계산합니다.

NUMERIC_FIELD

계산 대상 시계열 데이터를 지정합니다. 필드 값은 정수, 실수, 날짜처럼 숫자이어야 합니다.

by FIELD

by 절이 지정되면 필드 값 별로 그룹이 만들어집니다. 가령, by dst_port가 지정되면 80, 443 등 dst_port 필드의 값이 필드의 이름이 되고 시간 단위로 통계가 산출됩니다.

설명

STL은 seasonal-trend decomposition procedure based on loess의 약어로, period가 생략된 경우, 스펙트럼 분석을 통해 자동으로 계절변동 주기를 계산합니다.

stl 명령어는 시계열 데이터를 분석하여 _trend(추세), _seasonal(계절적 변동), _error(잔차) 필드를 출력합니다. 시계열 데이터가 주기성이 없으면(예를 들어 'period=0m') _seasonal 필드를 출력하지 않습니다.

3.42timecharttimechart

지정된 시간 단위마다 집계 함수의 결과를 계산합니다. by 절을 이용하여 그룹 필드를 지정하는 경우, 그룹 필드 값으로 필드가 생성되면서 필드별 통계 값을 계산합니다.

문법

timechart span=NUM{y|mon|w|d|h|m|s} FUNCTION_1() [as LABEL_1][, FUNCTION_2() [as LABEL_2], ...] [by FIELD]
span=NUM{y|mon|w|d|h|m|s}

집계 함수의 결과를 합산할 시간 단위를 지정합니다. 시간 단위는 s(초), m(분), h(시), d(일), w(주), mon(월), y(연) 단위로 지정할 수 있습니다. 가령, '10m'은 10분 단위입니다. 월 단위 mon을 사용하는 경우, 집계가 가능하도록 12의 약수 중에서 1, 2, 3, 4, 6만 지정할 수 있습니다. 즉, '3mon'은 허용되지만 '5mon'은 허용되지 않습니다. '12mon' 대신에 '1y'를 사용합니다. 단위가 y일 때, '1y'만 허용됩니다.

FUNCTION_1() [as LABEL_1][, FUNCTION_2() [as LABEL_2], ...]

실행할 집계 함수와 집계 함수 결과 값 필드에 사용할 필드 이름을 지정합니다. 이름을 지정하지 않으면 count(), sum(sent_pkts)과 같이 함수 이름을 필드 이름으로 사용하므로 필드 이름을 지정하는 것이 좋습니다.

by FIELD

by 절이 지정되면 필드 값 별로 그룹이 만들어집니다. 가령, by dst_port가 지정되면 80, 443 등 dst_port 필드의 값이 필드의 이름이 되고 시간 단위로 통계가 산출됩니다.

사용 예

1) 10분 단위 로그 발생량

timechart span=10m count

2) 1분 단위 bytes 변화 추이

timechart span=1m sum(bytes)

3) 각 목적지 포트의 1시간 단위 로그 발생 갯수

timechart span=1h count by dst_port

3.43tojsontojson

주어진 필드 값들을 JSON 형식 문자열로 변환합니다.

문법

tojson [output=TARGET_FIELD] [SOURCE_FIELD_1, SOURCE_FIELD_2, ...]
output=TARGET_FIELD

JSON 형식으로 변환한 문자열을 저장할 필드를 지정합니다. 지정하지 않으면 _json 필드에 저장합니다.

SOURCE_FIELD_1, SOURCE_FIELD_2, ...

JSON 형식으로 변환할 원본 필드를 지정합니다. 지정하지 않으면 모든 필드를 JSON으로 변환합니다.

사용 예

1) 전체 필드를 json 포맷으로 변환해 _json 필드로 출력

tojson

2) 전체 필드를 json 포맷으로 변환해 result 필드로 출력

tojson output=result

3) _time, line 필드를 json 포맷으로 변환해 jsonlog 필드로 출력

tojson output=jsonlog _time, line
Count of comments [0]