fluentd * CNCF에서 관리하는 오픈 소스 로깅 시스템 * 다양한 곳에서 생성되는 로그를 모으고, 필터링과 가공을 거쳐 다시 여러 대상으로 수집된 로그를 포워딩하는 역할을 한다. * fluentd를 컨테이너로 실행하고 다른 컨테이너에서 일반적인 JSON 파일 대신 fluentd 로깅 드라이버를 사용하도록 하면, 이들 컨테이너에서 생성되는 로그가 fluentd 컨테이너로 전송된다.
실습 fluentd는 설정 파일을 통해 로그 처리 내용을 정의할 수 있다. 로그를 수집해 stdout으로 그대로 출력하도록 설정된 fluentd 컨테이너를 실행해 보자. 그다음에는 fluentd 컨데이너로 로그를 전송하는 timecheck 컨테이너를 실행하라
➜ cd ch19/exercises/fluentd
# 설정 파일과 표준 포트를 적용한 fluentd 컨테이너를 실행
➜ docker container run -dp 24224:24224 --name fluentd \
-v "$(pwd)/conf:/fluentd/etc" \
-e FLUENTD_CONF=stdout.conf \
diamol/fluentd
# fluentd 로그 드라이버가 설정된 timecheck 애플리케이션 컨테이너 실행
➜ docker container run -d --name timecheck5 --log-driver=fluentd diamol/ch19-timecheck:5.0
# timecheck 컨테이너의 로그를 확인
➜ docker container logs timecheck5
Init
2023-08-11 11:24:30.174 +00:00 [INF] Environment: DEV; version: 5.0; time check: 11:24.30
2023-08-11 11:24:35.157 +00:00 [INF] Environment: DEV; version: 5.0; time check: 11:24.35
2023-08-11 11:24:40.157 +00:00 [INF] Environment: DEV; version: 5.0; time check: 11:24.40
2023-08-11 11:24:45.158 +00:00 [INF] Environment: DEV; version: 5.0; time check: 11:24.45
# fluentd 컨테이너의 로그를 확인
➜ docker container logs --tail 1
2023-08-11 11:26:35.000000000 +0000 04b5deceb5ea: {"container_id":"04b5deceb5eab86c4781a809bd8f8c21a8e1b884fdd761eced1d24107c9b4f07","container_name":"/timecheck5","source":"stdout","log":"2023-08-11 11:26:35.157 +00:00 [INF] Environment: DEV; version: 5.0; time check: 11:26.35"}
# {
# "container_id": "04b5deceb5eab86c4781a809bd8f8c21a8e1b884fdd761eced1d24107c9b4f07",
# "container_name": "/timecheck5",
# "source": "stdout",
# "log": "2023-08-11 11:26:35.157 +00:00 [INF] Environment: DEV; version: 5.0; time check: 11:26.35"
# }
- fluentd는 수집한 로그에 자체 메타데이터를 추가해 저장한다.
- 수집된 로그는 대개 중앙 데이터 스토어로 전송된다.
- NoSQL 문서 데이터베이스로 유명한 일래스틱서치 등이 로그 데이터 스토어로 널리 쓰인다.
- 일래스틱서치에 로그를 저장하고 로그 검색 UI 및 기능을 제공하는 키바나(Kibana)를 함께 사용하는 것이 일반적이다.
실습 모든 컨테이너를 제거한 후 fluentd-elasticsearch-kibana 로깅 컨테이너를 실행한다. 그다음에는 fluentd 로깅 드라이버가 설정된 timecheck 애플리케이션 컨테이너를 실행하라.
➜ cd ch19/exercises
# 로그 관련 스택 실행
➜ docker-compose -f fluentd/docker-compose.yml up -d
➜ docker container run -d --log-driver=fluentd diamol/ch19-timecheck:5.0
- 일래스틱서치가 완전히 실행될 때까지 잠시 기다린 후, 웹 브라우저 주소창에 http://localhost:5601을 입력해 키바나에 접근한다.
- 키바나 화면에서 Discover 탭을 클릭하면 검색을 수행할 문서 집합의 이름을 물을 것이다.
- 그림 19-10과 같이 fluentd*를 입력한다.
- fluentd가 수집한 모든 로그는 일래스틱서치에서 fluentd-{날짜}라는 이름의 문서 집합에 저장된다.
- 기본 탭인 Discover 탭을 보면 시간에 따라 생성된 문서의 수를 나타낸 막대그래프를 볼 수 있으며, 막대를 클릭하면 해당 시간에 생성된 문서의 상세 내용을 볼 수 있다.
EFK 장점 * 키바나를 사용하면 모든 컨테이너의 로그 중에서 특정 키워드를 포함하는 로그를 검색하거나 시간 등을 기준으로 로그를 필터링할 수 있다. * 9장에서 배웠던 그라파나와 유사한 대시보드 기능도 제공하며, 이 기능을 이용해 애플리케이션별 로그 건수나 오류 로그 건수 등을 한눈에 파악할 수 있다. * 일래스틱서치는 수평 확장이 매우 용이하므로 운영 환경에서 생성되는 대량의 로그를 처리하는데 적합하다.
실습 모든 구성 요소 컨테이너에 fluentd 로깅 드라이버를 적용해 image-gallery 애플리케이션을 실행해 보자.
# ch19/exercises 디렉터리에서 진행
➜ docker-compose -f image-gallery/docker-compose.yml up -d
- 웹 브라우저 주소창에 http://localhost:8010 을 입력해 애플리케이션에 약간의 트래픽을 발생시키면, 컨테이너가 로그를 생성하기 시작한다.
- image-gallery 애플리케이션의 fluentd는 로그에 해당 로그가 생성된 컴포넌트 정보가 담긴 태그를 추가하도록 설정됐다.
- 이렇게 하면 컨테이너 ID나 이름보다 로그의 출처를 훨씬 쉽게 알 수 있다.
로그에 태그 추가하기 * fluentd에서 로그에 태그를 추가하려면 간단히 로깅 드라이버에 설정을 추가하면 된다. * 고정된 이름을 사용하거나 별도의 식별자를 외부에서 주입할 수 있다. * 아래 예제에서는 gallery + 로그를 생성한 컴포넌트 이름 + 이미지 이름을 연결한 문자열을 태그로 사용했다.
예제 19-3 fluentd에서 로그의 출처를 알 수 있는 태그 추가 설정
services:
accesslog:
image: diamol/ch18-access-log
logging:
driver: "fluentd"
options:
tag: "gallery.access-log.{{.ImageName}}"
iotd:
image: diamol/ch18-image-of-the-day
logging:
driver: "fluentd"
options:
tag: "gallery.iotd.{{.ImageName}}"
image-gallery:
image: diamol/ch18-image-gallery
logging:
driver: "fluentd"
options:
tag: "gallery.image-gallery.{{.ImageName}}"
...
정리 * 중앙 집중식 로그 모델에 검색 가능한 데이터 스토어, 사용자 친화적인 검색 UI를 갖추는 것은 운영 환경에 필수적이다. * fluentd이외에도 오픈 소스 도구로는 그레이로그(Graylog), 상용 도구로는 스플렁크(Splunk) 등이 있다. * 앞서 설명했듯이 기본 로깅 드라이버는 도거 엔진 설정으로 지정하지만, 애플리케이션 매니페스트에서 로깅 시스템을 명시적으로 지정하는 편이 더 낫다. * 로깅 시스템에 대한 경험이 많지 않다면 fluentd를 추천할 만하다. * 개발용 단일 컴퓨터에서 운영용 클러스터로 어렵지 않게 확장할 수도 있다. * 어떤 환경에서든 동일한 방법으로 사용할 수 있다. * 로그에 메타데이터를 추가하거나 필터를 적용해 로그 유형별로 저장소를 달리할 수도 있다.