Tomcat 로그 EFK로 수집해보기
- 전제조건 : EFK는 이미 Kubernetes Cluster에 배포되어 있는 상태
쿠버네티스 로깅 아키텍처는 여러가지가 있는데 그 중 sidecar 방식을 택했다. 자꾸 키바나를 키아나라고 부르는 내 처지가 가슴이 웅장해진다... 적당히 정리하는 쪽으로 가겠다.
EFK는 Elasticsearch + Fluted + Kibana 3개를 뜻한다. 예전인 ELK가 근본이였는데 Kube 환경과 CNCF 재단덕에 Fluted가 더 많이 쓰인다. Fluted가 로그를 elasticsearch로 보내고 수집된 로그들은 kibana를 통해 시각화 된다. 나는 tomcat 로그를 수집해보기로 했다.
docker pull tomcat
톰캣 이미지를 끌어오고, 디플로이먼트를 만들어줬다. 파드로 만들어도 되긴 하는데 관리적인 측면을 위해서이다. 다른 내용보다 fluent 컨테이너에게 로그 넘겨 줄 디렉터리를 하나 지정해줘야 한다. 나는 톰캣 로그를 바로 끌어갈 수 있도록 로그 디렉터리를 지정해주었고, 페이지 하나를 생성해서 마운트 해주었다. 확인을 위해 8080 포트도 열어주었다.
containers:
- name: tomcat-log
image: 'docker.io/library/tomcat:latest'
ports:
- containerPort: 8080
protocol: TCP
volumeMounts:
- name: logs-data
mountPath: /usr/local/tomcat/logs
- name: hello-home
mountPath: /usr/local/tomcat/webapps/ROOT
생성하여 제대로 구동이 되는지, 마운트가 정상적으로 되었는지 확인해주었다. 이후 fluted 컨테이너를 추가해주었다.
containers:
- name: tomcat-log
image: 'docker.io/library/tomcat:latest'
ports:
- containerPort: 8080
protocol: TCP
volumeMounts:
- name: logs-data
mountPath: /usr/local/tomcat/logs
- name: hello-home
mountPath: /usr/local/tomcat/webapps/ROOT
imagePullPolicy: Always
- name: fluent-bit
image: 'fluent/fluent-bit:1.5-debug'
volumeMounts:
- name: custom-parser
mountPath: /fluent-bit/etc/custom-parser.conf
subPath: custom-parser.conf
- name: fluent-bit-config
mountPath: /fluent-bit/etc/fluent-bit.conf
subPath: fluent-bit.conf
- name: logs-data
mountPath: /tomcat-logs
보면 fluent 컨테이너는 tomcat log 디렉터리 이외에 컨피그맵을 통하여 custom-parser.conf, fluent-bit.conf를 교체해준다. custom-parser.conf를 통해 parser를 설정할 수 있다. 나는 기본으로 주는 아파치 파서 뽀려왔다.
# cat localhost_access_log.2020-09-24.txt
IP - - [24/Sep/2020:06:57:16 +0000] "GET /index.html HTTP/1.1" 200 12
IP - - [24/Sep/2020:06:57:17 +0000] "GET /index.html HTTP/1.1" 304 -
fluent-bit.conf는 IN/OUT을 통해 로그 수집 위치, 어디로 내보낼지 등을 설정할 수 있다.
[SERVICE]
Flush 5
Daemon off
Log_Level debug
Parsers_File /fluent-bit/etc/custom-parser.conf
[INPUT]
Name tail
Path /tomcat-logs/localhost_access_log.*
Tag access
[FILTER]
Name parser
Match access
Parser custom
Key_name log
Reserve_Data On
Preserve_Key On
[OUTPUT]
Name es
Match access
Host elasticsearch.kube-logging.svc.cluster.local
Port 9200
Logstash_Format True
Logstash_Prefix access_index
수정이 끝나면 잘 됐는지 확인한다. fluent 컨테이너에 대략 이런 로그가 있으면 된다.
[2020/09/24 07:28:00] [debug] [input:tail:tail.0] 1 new files found on path '/tomcat-logs/localhost_access_log.*'
[2020/09/24 07:28:00] [debug] [output:es:es.0] host=elasticsearch.kube-logging.svc.cluster.local port=9200 uri=/_bulk index=fluent-bit type=_doc
[2020/09/24 07:28:00] [debug] [router] match rule tail.0:es.0
[2020/09/24 07:28:00] [ info] [sp] stream processor started
키바나에 접속해 access에 관련된 패턴을 추가하고 로그 수집을 확인한다.
잘 들어오는 것을 볼 수 있다. 이제 대충 감은 잡았는데 아직 config 설정하는 방법이나 parser에 대해서는 조금 더 알아봐야 할 것 같다.