19-1. 표준 에러 스트림과 표준 출력 스트림
- 도커 이미지는 stdout, stderr을 사용하여 로그를 찍고 여기에서 컨테이너가 로그로 수집하는 구조이다. 이를 위해 로그를 JSON으로도 저장한다
# 1. 로그 확인
# 최근 로그 확인
docker container logs --tail 1 timecheck
# 컨테이너 로그 파일 경로 확인
docker container inspect --format='((.LogPath))' timecheck # 가상머신의 경로이기에 접근은 불가능함
19-2. 다른 곳으로 출력된 로그를 stdout 스트림에 전달하기
- 데몬 애플리케이션이나, 별도의 로그 프레임워크를 사용할 경우 stdout이나 stderr에 로그가 안나오기에 컨테이너 로그가 생성되지 않는다.
- 고로 별도의 프로세스로 stdout에 로그를 전달해야한다. 다만 이 때 별도의 프로세스의 생애주기에 관해 문제점이 존재한다. 그래도 안하는 것보단 낫다.
19-3. 컨테이너 로그 수집 및 포워딩하기
- 오픈소스 로깅 시스템으로 fluentd, Graylog, Splunk 등이 있다.
- 널리 쓰이는 오픈소스 로깅 시스템 fluentd는 통합 로깅 계층으로, 다양한 로그를 모으고 가공해준다. fluentd는 설정 파일을 통해 로그 처리를 정의한다.
# 2. fluentd 설정파일을 정의 후 통합 로깅 예제
cd ch19/exercises/fluentd
# 설정파일과 표준포트를 지정 후 fluentd 컨테이너 실행
docker container run -d -p 24224:24224 --name fluentd -v "$#(pwd)/conf:/fluentd/etc" -e FLUENTD_CONF=stdout.conf diamol/fluentd
# fluentd 로그 드라이버를 지정하고 애플리케이션 컨테이너 실행
docker container run -d --log-driver=fluentd --name timecheck5 diamol/ch19-timecheck:5.0
docker container logs timecheck5 # 오류! stdout으로 출력되는 로그가 없음
docker container logs --tail 1 fluentd # 짜란
- 일반적으로 NoSQL 문서 데이터베이스인 일래스틱 서치를 로그 데이터 스토어로, Kibana를 이용해 로그를 이용한다.
- 간단한 로깅 드라이버 설정 후 fluentd 로그에 태그를 추가할 수 있다.
# 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}}"
...
19-4. 로그 출력 및 로그 컬렉션 관리하기
- fluentd의 로그 필터링으로 몇몇 로그만 stdout으로 출력시키고, 나머지는 일래스틱서치로 전달하는 등의 유연한 설정이 가능하다.
# 4. 로그 태그에 따라 출력 방향을 조절하는 설정
<match gallery.access-log.**>
@type copy
<store>
@type stdout
</store>
</match>
<match gallery.**>
@type copy
<store>
@type elasticsearch
...
19-5. 컨테이너의 로깅 모델
- 위에서 사용한 일래스틱서치, fluentd, 키바나를 EFK스택이라 하며, UI를 갖춘 중앙 집중식 데이터베이스로 저장했다.