AWS. EKS 애플리케이션 로그 수집하기 (5)
created Sep 11, 2022 | updated Oct 15, 2022
AWS EKS의 애플리케이션 로그를 AWS OpenSearch로 수집하고 관리하기 위한 내용을 정리한다. 로그 전송은 Fluent Bit을 사용했다.
내용은 간단하지만 한 개의 포스팅에 포함하려니 내용이 길어지고 가독성을 해쳐서 몇 개의 파트로 나눴다.
본 포스팅은 Fluent Bit 멀티라인 파싱 설정 내용을 다룬다.
파트 목차
- 로그 수집 구성 개요
- AWS IRSA, K8S RBAC 설정
- DaemonSet 설정
- 로그 로테이트 설정
- 로그 멀티라인 파싱 설정 : 현재 포스트
로그 멀티라인 파싱 설정
자바 Stack Trace는 멀티라인으로 로그가 출력 된다. 이 경우 오류는 각 개별 라인으로 적재되고 로그를 분석하는데 불편함이 생긴다. 자바의 Stack Trace 멀티라인 로그를 묶을 수 있도록 설정해보자. 이번에도 Fluent Bit 설정 수정이 필요하다.
K8S ConfigMap 수정
apiVersion: v1
kind: ConfigMap
metadata:
labels:
k8s-app: fluent-bit
name: fluent-bit-config
namespace: logging
data:
fluent-bit.conf: |
[SERVICE]
Flush 1
Log_Level info
Daemon off
Parsers_File parsers.conf
HTTP_Server On
HTTP_Listen 0.0.0.0
HTTP_Port 2020
@INCLUDE input-kubernetes.conf
@INCLUDE filter-kubernetes.conf
@INCLUDE filter-multiline.conf @INCLUDE output-opensearch.conf
input-kubernetes.conf: |
[INPUT]
Name tail
Tag kube.*
Path /var/log/containers/*.log
Multiline.Parser docker DB /var/log/flb_kube.db
Mem_Buf_Limit 5MB
Skip_Long_Lines On
Refresh_Interval 10
Read_From_Head true
filter-kubernetes.conf: |
[FILTER]
Name kubernetes
Match kube.*
Kube_URL https://kubernetes.default.svc:443
Kube_CA_File /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
Kube_Token_File /var/run/secrets/kubernetes.io/serviceaccount/token
Kube_Tag_Prefix kube.var.log.containers.
Merge_Log On
Merge_Log_Key log_processed
K8S-Logging.Parser On
K8S-Logging.Exclude On
filter-multiline.conf: | [FILTER] Name multiline Match * Multiline.Key_Content log Multiline.Parser multiline-regex-springboot
output-opensearch.conf: |
[OUTPUT]
Name es
Match *
Host ${OPENSEARCH_ENDPOINT}
Port 443
TLS On
AWS_Auth On
AWS_Region ${AWS_REGION}
Replace_Dots On
Logstash_Format On
Logstash_DateFormat %Y-%m-%d
Logstash_Prefix ${INDEX_NAME}
parsers.conf: |
[PARSER]
Name docker
Format json
Time_Key time
Time_Format %Y-%m-%dT%H:%M:%S.%L
Time_Keep On
[MULTILINE_PARSER] # https://docs.fluentbit.io/manual/administration/configuring-fluent-bit/multiline-parsing Name multiline-regex-springboot Type regex Flush_Timeout 1000 # rules | state name | regex pattern | next state # ------|---------------|-----------------------------------------------|------------- Rule "start_state" "/(\d+\-\d+\-\d+ \d+\:\d+\:\d+\.\d+\s)(.*)/" "cont" Rule "cont" "/^(?!\d+\-\d+\-\d+ \d+\:\d+\:\d+\.\d+\s).*/" "cont"