Filebeat 멀티라인 적용 후 Kafka Connect ES Sink 장애 해결기 (DLQ + 오프셋 스킵)

2026. 2. 17. 09:44k8s/Kafka

요약
Minecraft 로그 수집 파이프라인(Filebeat → Kafka → Kafka Connect → Elasticsearch)에서 멀티라인 적용 이후 ES 인덱싱 에러가 발생했다.
DLQ를 활성화해 문제 레코드를 확인했고, 오프셋 스킵과 멀티라인 규칙 분리로 해결했다.


환경

  • Filebeat (Kubernetes DaemonSet)
  • Kafka / Kafka Connect
  • Elasticsearch (Data Stream)
  • 로그 소스: minecraft, list-logger

1. 멀티라인 적용
Minecraft 서버 로그에 스택트레이스가 있어 멀티라인 처리를 적용했다.

# filebeat.yml (초기 적용)
parsers:
  - container: ~
  - multiline:
      type: pattern
      pattern: '^(\\s+at\\s|\\s*Caused by:|\\s*\\.{3}\\s\\d+\\s+more)'
      negate: false
      match: after

2. 문제 발생
멀티라인 적용 이후, ES에 데이터가 안 들어오고 Kafka Connect task가 FAILED 됨.

원인 로그 요약:

  • mc.ok 필드는 boolean인데, 멀티라인으로 합쳐진 문자열이 들어가 document_parsing_exception 발생.
  • 특히 list-logger[MC_LIST] 라인이 멀티라인으로 합쳐짐.

3. DLQ 활성화
Kafka Connect에 DLQ 설정을 추가해서 문제 레코드를 확인했다.

"errors.deadletterqueue.topic.name": "minecraft-logs-dlq",
"errors.deadletterqueue.context.headers.enable": "true",
"errors.deadletterqueue.topic.replication.factor": "1"

DLQ에서 확인된 문제 레코드:

  • __connect.errors.offset: 375999
  • mc.okfalse rc=1 error=... 같은 문자열이 들어가 있음

4. 멀티라인 규칙 분리 (핵심 해결)
list-logger는 멀티라인이 필요 없으므로 컨테이너별로 입력을 분리했다.

filebeat.inputs:
  - type: filestream
    id: mc-minecraft
    paths:
      - /var/log/containers/*_minecraft_minecraft-*.log
    parsers:
      - container: ~
      - multiline:
          type: pattern
          pattern: '^(\\s+at\\s|\\s*Caused by:|\\s*\\.{3}\\s\\d+\\s+more)'
          negate: false
          match: after

  - type: filestream
    id: mc-list-logger
    paths:
      - /var/log/containers/*_minecraft_list-logger-*.log
    parsers:
      - container: ~

적용 명령:

kubectl apply -f y:\mc\filebeat.yaml
kubectl -n kube-system rollout restart ds/filebeat-minecraft-dell

5. 오프셋 스킵으로 문제 레코드 건너뛰기
Kafka는 레코드 단건 삭제가 불가하므로, 문제 오프셋을 건너뛰도록 그룹 오프셋을 변경했다.

오프셋 확인:

kafka-consumer-groups --bootstrap-server kafka-kraft.kafka.svc.cluster.local:9092 \
  --describe --group connect-minecraft-es-sink | grep minecraft-logs

오프셋 스킵:

kafka-consumer-groups --bootstrap-server kafka-kraft.kafka.svc.cluster.local:9092 \
  --group connect-minecraft-es-sink \
  --topic minecraft-logs:0 \
  --reset-offsets --to-offset 376000 --execute

커넥터 재시작:

curl -s -X POST http://localhost:8083/connectors/minecraft-es-sink/restart

6. 상태 확인
커넥터 상태:

curl -s http://localhost:8083/connectors/minecraft-es-sink/status

오프셋 정상 소비 확인:

kafka-consumer-groups --bootstrap-server kafka-kraft.kafka.svc.cluster.local:9092 \
  --describe --group connect-minecraft-es-sink | grep minecraft-logs

결론

  • 멀티라인 적용 시 컨테이너별로 구분하는 것이 중요하다.
  • DLQ를 통해 문제 레코드를 빠르게 확인 가능하다.
  • Kafka는 단건 삭제가 안 되므로 오프셋 스킵이 현실적인 해결책이다.