표준출력, 표준오류

보통 어플리케이션에서 로그를 다룰 때 해당 어플리케이션 언어 프레임워크에서 제공해주는 로그 프레임워크를 사용하여 표준출력으로 로그를 내보내거나 syslog로 내보내거나 elastic search 와 같은 외부 저장소로 내보내는 등 다양한 방식으로 어플리케이션 단에서 구현해서 사용한다.

도커 컨테이너에서 로그를 다루기 위해서는 어플리케이션에서의 로그를 표준출력과 표준오류로 내보내야 한다. 도커는 표준출력과 표준오류로 내보내진 오류를 받아서 logging driver 가 처리할 수 있도록 하는데, 도커는 아래와 같이 다양한 종류의 logging driver를 제공하고 있다. 보통 json을 많이 사용한다.

image

컨테이너 로그 확인하기

# 전체 로그 확인
$ docker logs [container]

# 마지막 로그 10줄 확인
$ docker logs --tail 10 [container]

# 실시간 로그 스트림 확인 (follow 옵션)
$ docker logs -f [container]

# 로그마다 타임스탬프 표시 (timestamp 옵션) 
$ docker logs -f -t [container]

image

image

image

컨테이너 로그 저장 경로

만약 log driver를 json-file로 지정한 경우 도커 컨테이너 로그는 호스트 운영체제의 /var/lib/docker/containers/${CONTAINER_ID}/${CONTAINER_ID}-json.log 내에 저장이 된다.

$ cat /var/lib/docker/containers/${CONTAINER_ID}/${CONTAINER_ID}-json.log

log를 보기 위해서는 권리자 권한이 필요하다.

image

로그 용량 제한하기

도커를 운영체제에 설치하면 로그 용량이 설정되어 있지 않다. 컨테이너 단위로 로그 용량 제한을 할 수 있지만, 도커 엔진에서 기본 설정을 진행할 수도 있다. (운영환경에서 설정 필수)

# 한 로그 파일 당 최대 크기를 3Mb로 제한하고, 최대 로그 파일 5개로 로테이팅.
$ docker run \
-d \
--log-driver=json-file \
--log-opt max-size=3m \
--log-opt max-file=5 \
nginx

위 명령어는 컨테이너 단위로 로그 용량을 제한한다. 도커 컨테이너를 실행할 때 로그 관련 옵션은 두가지가 있다. –log-driver 로그 드라이버를 설정하는 옵션과, –log-opt 로그 옵션을 설정하는 옵션이 있다.

도커 엔진에서 설정을 변경하려면 /etc/docker/daemon.json 파일에 아래와 같은 형태로 설정해주면된다. 내용을 적어준 뒤에 docker daemon restart를 해줘야 한다.

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "3m",
    "max-file": "5"
  }
}

도커 로그 드라이버

호스트 운영체제 상에 따로 로그 에이전트(fluentd 등)를 통해 중앙화된 로그 시스템 (elastic search, cloudwatch) 에 로그를 적재하여 전체 컨테이너의 로그를 확인한다.

image