안녕하세요. 인포그랩에서 DevOps 엔지니어로 일하는 Chris입니다. 요즘 Observability 분야에서는 단순 로그 수집을 넘어 실시간 데이터 변환, 멀티 플랫폼 라우팅, 비용 최적화가 화두로 떠오르고 있습니다.
클라우드 네이티브 환경에서 DevOps 엔지니어는 급증하는 로그와 메트릭 데이터를 효율적으로 처리해야 하는데요. 특히 Kubernetes 환경에서 수십 개의 마이크로서비스가 생성하는 대용량 로그와 메트릭 데이터를 Loki, Elasticsearch, Prometheus 등 오픈 소스 백엔드로 효율적으로 전송할 수 있어야 합니다.
기존에 많이 사용하는 Logstash나 Fluentd만으로는 이러한 요구사항을 충족하기 어렵습니다. 높은 메모리/CPU 사용량과 클라우드 네이티브 환경에서 성능 한계 때문입니다.
그러나 Vector를 사용하면 다릅니다. Vector는 Observability 데이터 파이프라인 도구인데요. 이는 Fluentd보다 성능이 우수하며, 메모리 효율성이 좋습니다. 따라서 성능 병목과 복잡한 데이터 변환 요구사항을 효과적으로 처리할 수 있고요. 방대한 로그와 메트릭 데이터도 효율적으로 관리할 수 있습니다.
이 글에서는 Vector의 개념과 특징, 사용 방법, Kubernetes 배포 방법을 실습 예제와 함께 살펴보겠습니다.

Vector란?
Vector는 Timber Technologies가 개발하고, 현재 Datadog에서 관리·유지보수하는 오픈 소스 Observability 데이터 파이프라인 도구입니다. 이 도구는 로그, 메트릭, 트레이스를 수집·변환·라우팅하는 통합 플랫폼이죠. Rust로 작성돼 메모리 안전성과 성능이 높은 게 특징이고요. 특히 Logstash나 Fluentd와 달리 단일 바이너리로 Agent와 Aggregator 역할을 모두 수행해 인프라 복잡성을 줄입니다.
아키텍처
Vector는 Sources → Transforms → Sinks의 3단계 파이프라인 구조로 동작합니다.
- 핵심 구성요소
- Sources(소스): 100개 이상의 데이터 입력 소스 지원(Kubernetes, Docker, Files, Metrics, Network 등)
- Transforms(변환): VRL(Vector Remap Language) 기반의 강력한 데이터 변환, 필터링, 집계, 라우팅
- Sinks(싱크): Loki, Prometheus, Elasticsearch, Kafka, S3 등 100개 이상의 출력 대상 지원
Vector의 Aggregator 모드를 활용하면 여러 Kubernetes 클러스터의 로그를 중앙에서 통합 처리할 수 있습니다. 이는 대규모 환경에서 운영 효율성을 크게 향상합니다.
Vector vs Logstash 비교
Vector의 특징은 Logstash와 비교할 때 명확히 확인할 수 있습니다.

-
Vector vs Logstash 성능 벤치마크 (처리량 기준)
Vector는 다양한 처리 유형에서 Logstash보다 높은 속도를 보입니다.
VRL: Vector의 차별화 요소
Vector의 강력한 차별화 요소는 바로 VRL(Vector Remap Language)입니다. 이는 데이터 변환과 라우팅에 특화된 전용 언어인데요. Vector를 효과적으로 사용하려면 VRL을 익혀야 합니다.
VRL의 문법은 직관적이라 학습 부담이 크지 않습니다. 예를 들어, 간단한 필드 변환이나 라우팅 로직을 몇 줄의 코드로 구현할 수 있죠.
VRL 학습 투자는 Vector의 높은 성능과 리소스 효율성으로 충분히 보상받을 수 있습니다. 특히 클라우드 네이티브 환경에서는 ‘통합 데이터 관리’와 ‘멀티 백엔드 지원’이라는 Vector의 강력한 이점을 최대한 누릴 수 있습니다.
-
타입 안전성
VRL의 가장 큰 특징은 ‘컴파일 타임 타입 체크’입니다. 다음 예제에서 보듯 VRL은 명시적인 런타임 타입 변환과 검사로 데이터 처리 시 발생 가능한 오류를 미리 파악하고, 런타임 크래시를 방지해 안정적인 데이터 처리를 지원합니다.
# 컴파일 타임 타입 체크로 런타임 에러 방지
.status_code = to_int!(.status) # 명시적 타입 변환, 변환에 실패하면 이벤트가 드롭되고 에러 로그가 기록됩니다. 컴파일 타임에 타입이 보장되어 런타임 크래시가 발생하지 않습니다.
# JSON 파싱과 에러 처리
parsed, err = parse_json(.message)
if err != null {
.parse_error = err # 에러가 발생해도 프로그램이 중단되지 않고 처리를 계속합니다
.original_message = .message
} else {
. = merge!(., parsed) # JSON 파싱에 성공하면 원본 이벤트와 파싱된 데이터를 병합합니다
} -
VRL vs Logstash Ruby DSL 비교
VRL과 Logstash Ruby DSL에는 다음 차이점이 있습니다.
- 타입 안전성: VRL은 컴파일 타임 에러 체크, Logstash는 런타임 에러 가능성 있음
- 표현력: VRL이 더 간결하고 직관적인 문법 제공
- 성능: 네이티브 컴파일 vs JVM 인터프리터로 압도적인 성능 차이 보임
- 에러 처리: VRL은 명시적 에러 처리 지원, Logstash는 태그 기반 복잡한 처리 사용
- 디버깅: VRL은 명확한 에러 메시지 제공, Logstash는 디버깅이 어려움
-
VRL vs Logstash Ruby DSL 예제
같은 로직을 VRL과 Logstash Ruby DSL로 각각 구현한 예제를 살펴보겠습니다.
-
VRL 구현:
# 더 간결하고 타입 안전한 처리
parsed, err = parse_json(.message)
if err != null {
.parse_error = err
.original_message = .message
} else {
. = merge!(., parsed)
}
if exists(.level) {
.level = to_string!(.level)
.level = downcase(.level)
} else {
.level = "info"
}
# 복잡한 조건도 간단하게 표현
if .level == "debug" {
abort # 이벤트 드롭
} -
Logstash Ruby DSL 구현:
filter {
json {
source => "message"
}
mutate {
lowercase => [ "level" ]
}
if [level] == "debug" {
drop { }
}
# 에러 처리가 복잡함
if "_jsonparsefailure" in [tags] {
mutate {
add_field => { "parse_error" => "JSON parsing failed" }
}
}
}
-
Vector 활용 실습
이제 Vector를 실제 환경에서 사용하기 위해 이를 설치하고 설정하는 방법을 알아보겠습니다.
사전 요구사항
Vector는 Linux, macOS, Windows를 지원합니다. Kubernetes 환경에서는 Helm Chart로 손쉽게 배포할 수 있습니다.
설치
OS별로 다음 명령어를 사용해 Vector를 설치합니다.
-
macOS/Linux
# 스크립트 설치 (권장)
$ curl --proto '=https' --tlsv1.2 -sSfL https://sh.vector.dev | bash
# macOS - Homebrew
$ brew tap vectordotdev/brew && brew install vector
# Ubuntu/Debian
$ bash -c "$(curl -L https://setup.vector.dev)"
$ sudo apt-get install vector -
Windows
# Chocolatey
PS> choco install vector
# 또는 직접 다운로드
PS> Invoke-WebRequest -Uri "https://github.com/vectordotdev/vector/releases/latest/download/vector-x86_64-pc-windows-msvc.zip" -OutFile vector.zip
VRL 변환, Loki 전송
지금부터 간 단한 데모 로그를 생성하고, VRL 변환을 거쳐 Loki로 전송하는 과정을 실습하겠습니다. 이 실습은 실제 Apache 로그와 유사한 데이터로 Vector의 핵심 기능인 수집(Sources) → 변환(Transforms) → 전송(Sinks) 파이프라인을 직접 구현하며, VRL의 강력한 데이터 처리 능력을 체험하는 데 의미가 있습니다.
-
Vector가 설치된 상태에서 터미널을 열고, 아래 명령어로 Vector 버전을 확인합니다.
$ vector --version
Vector 버전 확인 화면
-
간단한 설정 파 일을 만들어 테스트를 진행합니다. 먼저 데모용 Volume으로 사용할 디렉터리를 생성합니다.
$ mkdir -p vector-test/vector-vl
$ cd vector-test -
vector-test 디렉터리에 진입한 다음,
demo-vector.yaml
파일을 생성합니다.# demo-vector.yaml
data_dir: "vector-vl" # ⚠️ 데모용: 프로덕션에서는 Persistent Volume 필수
sources:
demo_logs:
type: demo_logs
format: json
interval: 1.0
count: 5
transforms:
parse_and_enrich:
type: remap
inputs: ["demo_logs"]
source: |
# JSON 메시지 파싱
parsed = parse_json!(.message)
# HTTP 상태 코드 기반 로그 레벨 설정
status_code = to_int!(parsed.status)
if status_code >= 500 {
.level = "error"
} else if status_code >= 400 {
.level = "warn"
} else {
.level = "info"
}
# 파싱된 필드들 추가
.http_status = status_code
.http_method = parsed.method
.request_path = parsed.request
.user_id = parsed."user-identifier"
# 타임스탬프 추가
.timestamp = now()
# 에러 감지
if .level == "error" {
.alert_required = true
.severity = "high"
} else {
.alert_required = false
.severity = "low"
}
sinks:
console_output:
type: console
inputs: ["parse_and_enrich"]
encoding:
codec: json -
설정 파일이 올바른지 검증합니다.
$ vector validate demo-vector.yaml
# 실행 예상 결과
√ Loaded ["demo-vector.yaml"]
√ Component configuration
√ Health check "console_output"
-------------------------------
Validated -
Vector를 실행해 데모 로그를 확인합니다.
$ vector --config demo-vector.yaml
Vector 데모 실행 화면
데모 실행 화면의 동작 과정은 다음과 같습니다.
demo_logs
타입의 입력 소스가 1초마다 가짜 Apache 로그를 5개 생성합니다.parse_and_enrich
으로 선언한 vector transforms이 동작합니다.- JSON Message 파싱
- HTTP Status Code별 레벨 부여
- 파싱된 필드 추가
- 파싱된 .level 필드에 따라 에러 알람 여부 마킹
console_output
으로 JSON 형태 직렬화를 거쳐 출력됩니다.