로깅 드라이버 구성
로깅 드라이버 구성 — 컨테이너 로그를 어디로 보낼지 정하기
docker logs로 컨테이너 로그를 보는 건 쉬운데, 그 로그가 어떻게 수집·저장되는지는 생각해볼 만해요. 도커는 실행 중인 컨테이너와 서비스에서 로그 정보를 얻는 여러 메커니즘을 제공하는데, 이를 로깅 드라이버(logging driver)라고 불러요. 데몬마다 기본 로깅 드라이버가 있고, 이를 바꿔서 로그를 다른 곳으로 보낼 수 있어요.
본문
로깅 드라이버란
각 도커 데몬은 기본 로깅 드라이버를 하나 갖고 있어요. 컨테이너는 별도로 다른 드라이버를 지정하지 않는 한 그 기본 드라이버를 사용해요. 기본값으로 도커는 json-file 로깅 드라이버를 쓰는데, 컨테이너 로그를 내부적으로 JSON으로 캐시해요. 도커에 포함된 드라이버 외에 로깅 드라이버 플러그인으로 확장할 수도 있어요.
기본 로깅 드라이버 구성하기
도커 데몬이 특정 로깅 드라이버를 기본으로 쓰게 하려면, daemon.json 설정 파일에서 log-driver 값을 해당 드라이버 이름으로 설정해요. 기본값은 json-file이에요. 다음 예시는 기본 로깅 드라이버를 local로 바꾸는 설정이에요.
{
"log-driver": "local"
}
로깅 드라이버에 설정 가능한 옵션이 있다면, daemon.json에서 log-opts 키 아래 JSON 객체로 설정할 수 있어요. 다음 예시는 json-file 드라이버에 네 가지 설정 옵션을 넣은 거예요.
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3",
"labels": "production_status",
"env": "os,customer"
}
}
여기서 주의할 점이 하나 있어요. daemon.json의 log-opts 옵션 값은 모두 문자열로 제공해야 해요. 그래서 위 예시의 max-file 값처럼 불리언이나 숫자 값도 따옴표(")로 감싸야 해요.
로깅 드라이버를 지정하지 않으면 기본값은 json-file이에요. 현재 도커 데몬의 기본 로깅 드라이버를 확인하려면 docker info를 실행해서 Logging Driver 항목을 찾아보세요. 다음 명령처럼 쓸 수 있어요.
$ docker info --format '{{.LoggingDriver}}'
json-file
중요한 점은, 데몬 설정에서 기본 로깅 드라이버나 옵션을 바꿔도 그 뒤에 새로 만들어진 컨테이너에만 적용된다는 거예요. 기존 컨테이너는 생성 당시의 로깅 드라이버 옵션을 그대로 유지해요. 컨테이너의 로깅 드라이버를 바꾸려면 원하는 옵션과 함께 컨테이너를 다시 만들어야 해요.
컨테이너별 로깅 드라이버 구성하기
컨테이너를 시작할 때 --log-driver 플래그로 데몬 기본값과 다른 로깅 드라이버를 지정할 수 있어요. 설정 옵션이 있다면 --log-opt <NAME>=<VALUE> 플래그를 여러 번 써서 지정할 수 있어요. 컨테이너가 기본 로깅 드라이버를 쓰더라도 설정 옵션은 다르게 쓸 수 있어요.
다음 예시는 Alpine 컨테이너를 none 로깅 드라이버로 시작해요.
$ docker run -it --log-driver none alpine ash
실행 중인 컨테이너의 현재 로깅 드라이버를 확인하려면, 데몬이 json-file 드라이버를 쓸 때 다음 docker inspect 명령을 사용해요. <CONTAINER> 자리에 컨테이너 이름이나 ID를 넣으면 돼요.
$ docker inspect -f '{{.HostConfig.LogConfig.Type}}' <CONTAINER>
json-file
로그 메시지 전달 모드
도커는 컨테이너에서 로그 드라이버로 메시지를 전달하는 두 가지 모드를 제공해요.
- (기본) 직접·블로킹 전달 — 컨테이너에서 드라이버로 직접, 블로킹 방식으로 전달해요.
- 비블로킹 전달 — 로그 메시지를 중간의 컨테이너별 버퍼에 저장했다가 드라이버가 소비하게 해요.
mode 로그 옵션이 blocking(기본)을 쓸지 non-blocking을 쓸지 제어해요.
로깅 드라이버와 환경 변수·라벨
일부 로깅 드라이버는 컨테이너의 --env|-e나 --label 플래그 값을 로그에 추가해요. 다음 예시는 데몬 기본 드라이버(json-file)를 쓰면서 os=ubuntu 환경 변수를 설정한 컨테이너를 시작해요. 이렇게 하면 로그에 환경 변수 값이 함께 남게 돼요.
지원되는 로깅 드라이버
도커가 기본 제공하는 로깅 드라이버는 다음과 같아요. 각 드라이버의 설정 옵션은 해당 문서 링크에서 확인할 수 있어요.
| 드라이버 | 설명 |
|---|---|
none |
컨테이너 로그를 사용할 수 없고, docker logs가 아무 출력도 주지 않아요. |
json-file |
로그를 JSON으로 포맷해요. 도커의 기본 로깅 드라이버예요. |
syslog |
로그 메시지를 syslog 기능으로 써요. 호스트 머신에서 syslog 데몬이 실행 중이어야 해요. |
journald |
로그 메시지를 journald로 써요. 호스트 머신에서 journald 데몬이 실행 중이어야 해요. |
gelf |
Graylog Extended Log Format(GELF) 엔드포인트(Graylog, Logstash 등)로 로그 메시지를 써요. |
fluentd |
fluentd(forward input)로 로그 메시지를 써요. 호스트 머신에서 fluentd 데몬이 실행 중이어야 해요. |
awslogs |
로그 메시지를 Amazon CloudWatch Logs로 써요. |
splunk |
HTTP Event Collector를 사용해 splunk로 로그 메시지를 써요. |
etwlogs |
로그 메시지를 Event Tracing for Windows(ETW) 이벤트로 써요. Windows 플랫폼에서만 가능해요. |
gcplogs |
로그 메시지를 Google Cloud Platform(GCP) Logging으로 써요. |
로깅 드라이버의 제약
- 로그 정보를 읽으려면 로테이션된 로그 파일을 압축 해제해야 해서, 잠시 동안 디스크 사용량이 늘어나고 CPU 사용도 증가할 수 있어요.
- 로그 파일 정보의 최대 크기는 도커 데이터 디렉토리가 위치한 호스트 저장 장치의 용량이 결정해요.