본문 바로가기

DevOps & Infra/Docker

[Infrastructure/Docker] 도커 로깅 드라이버

도커 로깅 드라이버

도커는 컨테이너의 Linux 표준 출력(STDOUT)와 표준 에러(STDERR)에 대한 로그를 읽을 수 있는 기능을 제공합니다. 도커의 기본 로그 출력에 대해서는 이전 문서를 참고합니다.

도커에서 로그를 관리하는 방법은 다음과 같이 크게 두 가지로 구분됩니다.

  • 파일에 저장
  • 데이터베이스에 저장

로그가 파일에 저장되거나 또는 데이터베이스에 저장되는 방식, 그리고 로그가 출력되는 포멧에 대해서 결정하는 것이 도커의 로깅 드라이버(Logging Driver)입니다.

각 컨테이너는 별도의 로깅 드라이버를 사용하도록 지정되지 않으면 기본적으로 도커 데몬에서 지정하고 있는 로깅 드라이버를 사용하게 됩니다.

  • 기본적으로 도커 데몬의 로깅 드라이버 사용
  • 컨테이너에서 지정된 임의의 로깅 드라이버 사용

기본적으로 도커에 포함되어 있는 로깅 드라이버 중 하나를 선택하지만, 다른 로깅 드라이버 플러그인 또는 직접 구현한 것을 사용 할 수도 있습니다.

로깅 드라이버 환경 설정

daemon.json 파일의 내용을 수정하여 도커 데몬의 기본 로깅 드라이버를 수정하는 등의 환경 설정이 가능합니다. daemon.json 파일의 경로는 다음과 같습니다.

  • Linux
    /etc/docker/daemon.json
  • MacOS
    /Users/사용자 명/.docker/daemon.json

기본으로 사용하려는 로깅 드라이버 유형을 지정하려면 다음과 같이 파일 내용을 수정합니다.

{
      "log-driver": "local"	
}

지정된 로깅 드라이버가 옵션을 구성 할 수 있다면 log-opts 키를 사용하여 확장합니다. log-opts에 지정되는 옵션 값들은 모두 문자열 타입으로 입력되어야 합니다(따라서 모든 값들은 따옴표""로 구성됩니다).

{
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "10m",
        "max-file": "3",
        "labels": "production_status",
        "env": "os,customer"
    }
}

만약 log-driver로 지정된 키/값이 없다면 도커 데몬은 기본으로 json-file 드라이버를 사용합니다. 다음 명령문은 도커 데몬이 사용하는 디폴트 로깅 드라이버 정보를 출력합니다.

$ docker info --format '{{.LoggingDriver}}'

daemon.json 파일을 변경하였다면 도커를 재시작해야 합니다. 도커가 재시작되고 새로 실행되는 컨테이너는 변경된 환경 설정에 영향을 받습니다. 기존의 컨테이너는 새로운 로깅 드라이버 구성을 적용받지 않고 설정 값을 유지합니다.

json-file과 local 드라이버

도커는 디폴트 로깅 드라이버로 json-file 드라이버를 사용합니다(이전 버전 도커 및 쿠버네티스와의 호환성). json-file 드라이버는 log-rotation이 수행되지 않으므로 사용시 주의해야합니다. 표준 출력 또는 표준 에러를 많이 생산하는 컨테이너는 디스크 소진의 원인이 될 수 있습니다. 일반적으로는 log-rotation을 지원하고 효율적인 파일 형식을 사용하는 local 드라이버 사용을 권장합니다.

컨테이너 실행 단계에서 로깅 드라이버 지정

컨테이너를 실행할 때 --log-driver 플래그를 사용하여 도커 데몬에서 지정하는 디폴트 로깅 드라이버와 다른 로깅 드라이버를 사용 할 수 있습니다.

$ docker run --log-driver [로그 드라이버] [이미지 이름]

만약 드라이버에서 지정 가능한 추가 옵션이 있다면 다음과 같이 사용합니다.

$ docker run --log-driver [로그 드라이버] --log-opt [키]=[값] [이미지 이름]

예를 들어 다음 컨테이너는 json-file 드라이버를 선택하여 실행합니다.

$ docker run --name test -d --log-driver json-file busybox sh -c "while true; do $(echo date); sleep 1; done"

실행 중인 컨테이너는 docker inspect 명령어를 사용하여 정보를 출력 할 수 있습니다. 이때 로깅 드라이버의 유형만 출력하려면 다음과 같이 사용합니다.

$ docker inspect -f '{{.HostConfig.LogConfig.Type}}' [컨테이너 ID]