로그프레소에서 자주 쓰이는 로그 파싱 방법 5가지를 예제로 정리했습니다.
아래 쿼리는 모두 json "{...}"로 샘플 로그를 즉석에서 만들어 파싱하므로, 별도 데이터 수집 설정 없이 웹 콘솔 쿼리 창에 그대로 붙여넣어 바로 실행·조회할 수 있습니다.
목차
| # | 방식 | 사용 명령어 | 적합한 경우 |
|---|---|---|---|
| 1 | CSV 파싱 | parsecsv |
쉼표 등 구분자로 나뉜 고정 필드 |
| 2 | Key-Value 파싱 | parsekv |
key=value 형태의 로그 |
| 3 | 정규표현식 파싱 | rex |
구조가 불규칙하거나 패턴 추출이 필요한 경우 |
| 4 | 쿼리로 파싱 | indexof() · substr() + parsekv |
패턴이 단순·고정적이고 저부하가 필요한 경우 |
| 5 | 파서로 파싱 | parse |
사전 정의된 앱/장비 파서를 적용하는 경우 |
1. CSV 파싱 — parsecsv
쉼표로 구분된 값을 지정한 필드 순서대로 나눕니다.
참고 문서 : parsecsv | 로그프레소 쿼리
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 | 로그프레소 쿼리
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 | 로그프레소 쿼리
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() | 로그프레소 쿼리
참고 문서(2) : substr() | 로그프레소 쿼리
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 샘플로그를 파싱하는 예시입니다.
로그프레소에서 제공하는 앱 목록은 앱 찾기 | 로그프레소 스토어 에서 확인 가능합니다.
하기 쿼리 수행을 위해서는 bluemax ngf 앱 적용이 필요합니다.
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 |
| 파서 확인 위치 | 웹 콘솔 → 수집 → 파서 |
기타
- 위 파서로 파싱된 로그를 실제로 수집·저장하려면, 수집 모델을 생성한 뒤 수집기에 적용해야 합니다.(참고 문서 : 수집 모델 | 로그프레소 소나 사용자 인터페이스 설명서)
- 로그프레소가 앱으로 파싱을 지원하는 장비(예: BLUEMAX NGF)의 경우, 파서 · 로그 스키마 · 수집 모델을 앱에서 함께 제공하므로 별도로 직접 정의할 필요 없이 곧바로 활용할 수 있습니다.