# 파싱 실습 가이드

**URL:** <https://forum.logpresso.com/t/topic/207>\
**Category:** How To\
**Created:** [8월 5, 2026, 2:02오전 UTC](https://forum.logpresso.com/t/topic/207 "2026-08-05T02:02:53Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![ty.kim](https://yyz2.discourse-cdn.com/flex034/user_avatar/forum.logpresso.com/ty.kim/32/124_2.png) [@ty.kim](https://forum.logpresso.com/u/ty.kim)\
**Post date:** [8월 5, 2026, 2:02오전 UTC](https://forum.logpresso.com/t/topic/207/1 "2026-08-05T02:02:53Z")

</div>

로그프레소에서 자주 쓰이는 **로그 파싱 방법 5가지** 를 예제로 정리했습니다.

아래 쿼리는 모두 `json "{...}"`로 샘플 로그를 즉석에서 만들어 파싱하므로, 별도 데이터 수집 설정 없이 **웹 콘솔 쿼리 창에 그대로 붙여넣어 바로 실행·조회** 할 수 있습니다.

## 목차

| # | 방식 | 사용 명령어 | 적합한 경우 |
| --- | --- | --- | --- |
| 1 | CSV 파싱 | `parsecsv` | 쉼표 등 구분자로 나뉜 고정 필드 |
| 2 | Key-Value 파싱 | `parsekv` | `key=value` 형태의 로그 |
| 3 | 정규표현식 파싱 | `rex` | 구조가 불규칙하거나 패턴 추출이 필요한 경우 |
| 4 | 쿼리로 파싱 | `indexof()` · `substr()` + `parsekv` | 패턴이 단순·고정적이고 저부하가 필요한 경우 |
| 5 | 파서로 파싱 | `parse` | 사전 정의된 앱/장비 파서를 적용하는 경우 |

* * *

## 1. CSV 파싱 — `parsecsv`

쉼표로 구분된 값을 지정한 필드 순서대로 나눕니다.

참고 문서 : [parsecsv | 로그프레소 쿼리](https://docs.logpresso.com/ko/query/parsecsv-command)

```auto
json "{'line': '192.0.2.1,GET,/index.html,200,1024'}"
| parsecsv src_ip, method, uri, status, bytes

```

**결과**

| src\_ip | method | uri | status | bytes |
| --- | --- | --- | --- | --- |
| 192.0.2.1 | GET | /index.html | 200 | 1024 |

* * *

## 2. Key-Value 파싱 — `parsekv`

`key=value` 쌍을 자동으로 인식해 필드로 추출합니다.

참고 문서 : [parsekv | 로그프레소 쿼리](https://docs.logpresso.com/ko/query/parsekv-command)

```auto
json "{'line': 'src=192.0.2.1 src_port=55324 dst=198.51.100.2 dst_port=80'}"
| parsekv

```

**결과**

| src | src\_port | dst | dst\_port |
| --- | --- | --- | --- |
| 192.0.2.1 | 55324 | 198.51.100.2 | 80 |

* * *

## 3. 정규표현식 파싱 — `rex`

명명된 캡처 그룹 `(?<필드명>패턴)`으로 값을 추출합니다.

참고 문서 : [rex | 로그프레소 쿼리](https://docs.logpresso.com/ko/query/rex-command)

```auto
json "{'line': '192.0.2.1 GET /index.html 200 1024'}"
| rex field=line "(?<src_ip>.*?) (?<method>.*?) (?<uri>.*?) (?<status>.*?) (?<bytes>.*)$"

```

**결과**

| src\_ip | method | uri | status | bytes |
| --- | --- | --- | --- | --- |
| 192.0.2.1 | GET | /index.html | 200 | 1024 |

> **주의.** 정규표현식 기반 파서는 메모리 부하의 원인이 될 수 있습니다. 따라서 대량 수집 단계보다는 **쿼리 조회와 같은 단건 조회에서만 사용하기를 권장** 합니다. 상시 수집·저장이 필요하다면 아래 4번 방식처럼 필요한 부분만 잘라 처리하거나, 사전 정의된 파서(5번)를 사용하세요.

* * *

## 4. 쿼리로 파싱하기 (`rex` 대비 저부하)

`rex` 대신 `indexof()` · `substr()`로 파싱이 필요한 항목만 잘라 남긴 뒤 `parsekv`로 넘깁니다.  
전체를 정규표현식으로 훑지 않고 필요한 부분만 처리하므로, 패턴이 단순·고정적일 때 부하가 적습니다.

참고 문서(1) : [indexof() | 로그프레소 쿼리](https://docs.logpresso.com/ko/query/indexof-function)

참고 문서(2) : [substr() | 로그프레소 쿼리](https://docs.logpresso.com/ko/query/substr-function)

```auto
json "{'line': '2026-08-05 INFO: user: alice|action: login|result: success'}"
| eval pos1 = indexof(line, ": ")
| eval body = substr(line, pos1 + 2)
| parsekv pairdelim="|" kvdelim=": " field=body

```

**결과**

| user | action | result |
| --- | --- | --- |
| alice | login | success |

**동작 설명**

- `indexof(line, ": ")` — 첫 번째 `": "` 위치를 찾습니다. (타임스탬프의 `:`는 뒤에 공백이 없어 걸리지 않습니다.)
- `substr(line, pos1 + 2)` — 그 뒤부터 끝까지 잘라 `body`에 담습니다.
- `parsekv pairdelim="|" kvdelim=": " field=body` — `body`를 `|`로 쌍을, `:` 로 키-값을 분리합니다.

* * *

## 5. 앱 파싱하기 (방화벽 NGF 세션 로그)

사전 정의된 파서 `bluemax`를 `parse` 명령어로 적용해 블루맥스 NGF 방화벽 세션 로그를 필드로 추출합니다.  
bluemax 샘플로그를 파싱하는 예시입니다.

로그프레소에서 제공하는 앱 목록은 [앱 찾기 | 로그프레소 스토어](https://logpresso.store/ko/apps) 에서 확인 가능합니다.

하기 쿼리 수행을 위해서는 bluemax ngf 앱 적용이 필요합니다.

```auto
json "{'line': '<134>1 2026-08-05T02:06:25.159201398Z [fw4_allow] [192.168.0.10] 2026-08-05 11:02:06,2026-08-05 11:06:20,254,BLUEMAX,1,auto_ruleId_1,0,,forward,192.168.0.10,-,10000,192.168.0.20,80,6,http,HTTP,Web,no,DMZ,eth0,165,120,15840,9600,285,25440,,-,-,no,no,-,KR,KR'}"
| parse bluemax-ngf

```

**동작 설명**

- `parse bluemax` — 수집기 설정에 등록된 `bluemax` 파서를 적용해 `line` 필드를 파싱합니다.
- 원본 `line` 필드를 함께 남기려면 `parse overlay=t bluemax`를 사용합니다.

**파서 정보**

| 항목 | 값 |
| --- | --- |
| 앱 | bluemax ngf (버전 `1.10.2603.2`) |
| 파서명 | `bluemax-ngf` |
| 파서 확인 위치 | 웹 콘솔 → 수집 → 파서 |

* * *

## 기타

- 위 파서로 파싱된 로그를 실제로 수집·저장하려면, **수집 모델을 생성한 뒤 수집기에 적용** 해야 합니다.(참고 문서 : [수집 모델 | 로그프레소 소나 사용자 인터페이스 설명서](https://docs.logpresso.com/ko/sonar/5.0/ui/section-logger-models))
- 로그프레소가 앱으로 파싱을 지원하는 장비(예: BLUEMAX NGF)의 경우, **파서 · 로그 스키마 · 수집 모델을 앱에서 함께 제공** 하므로 별도로 직접 정의할 필요 없이 곧바로 활용할 수 있습니다.
