본문 바로가기

DevOps & Infra/Docker

[Infrastructure/Docker] 도커 컨테이너 로그 출력, docker logs 명령어와 플래그

docker logs

실행 중인 도커 컨테이너는 하나의 독립된 프로세스로 볼 수 있습니다. 로컬 호스트에서 해당 프로세스의 표준 출력(STDOUT)과 표준 에러(STDERR)를 확인하려면 어떻게 해야할까요? 도커에서는 다음 명령문을 제공합니다.

$ docker logs [옵션] [컨테이너 ID]

docker logs는 실행 시점에 존재하는 모든 로그를 출력합니다. 이 명령문은 json-file 또는 journald 로깅 드라이버로 시작하는 컨테이너에서만 동작합니다. 도커 컨테이너의 디폴트 로깅 드라이버는 json-file이기 때문에 별도 지정을 하지 않았다면 이 명령문을 사용 할 수 있습니다.

플래그

docker logs의 옵션으로 다음 플래그를 사용 할 수 있습니다.

플래그 비고
--tail [lines] 또는 -n [lines] 출력 가능한 로그 전체에서 [lines]로 지정한 수량의 행만 출력합니다. 로그 전체를 출력하려면 [lines]에 all을 입력합니다. [lines]를 입력하지 않으면 디폴트는 all입니다.
--follow 또는 -f 컨테이너가 새롭게 기록하는 로그를 실시간으로 출력합니다.
--timestamp 또는 -t 로그가 기록된 시간을 타임스탬프(e.g. 2013-01-02T13:23:37Z)로 함께 출력합니다.
--since 지정된 타임 스탬프(e.g. 2013-01-02T13:23:37Z) 또는 상대 시간(e.g. 42m for 42 minutes) 이후에 기록된 로그만 출력합니다.
--until 지정된 타임 스탬프(e.g. 2013-01-02T13:23:37Z) 또는 상대 시간(e.g. 42m for 42 minutes) 이전에 기록된 로그만 출력합니다. 1.35+ 버전 이상부터 지원
--details 로그의 세부 정보를 함께 출력합니다.

테스트 환경 구축

로그 출력 테스트를 위해 간단한 테스트 환경을 구축합니다. 일정 시간마다 표준 출력을 실행하는 컨테이너를 구현합니다. 작업을 간소화 하기 위해서 BusyBox 이미지를 사용합니다.

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

명령문을 실행하면 BusyBox 컨테이너는 1초에 한 번씩 현재 시간을 표준 출력합니다. 로컬 호스트에서 다음 명령문을 추가로 실행하여 로그를 출력합니다.

$ docker logs test
Fri Apr  1 17:10:12 UTC 2022
Fri Apr  1 17:10:13 UTC 2022
Fri Apr  1 17:10:14 UTC 2022
Fri Apr  1 17:10:15 UTC 2022
Fri Apr  1 17:10:16 UTC 2022
Fri Apr  1 17:10:17 UTC 2022
...

이제 docker logs에서 제공하는 플래그를 사용하여 기본적인 로그 출력에 대한 테스트를 진행해봅니다.

새로 기록되는 로그만 실시간 출력

새로 기록되는 로그만 실시간으로 출력하려면 다음 두 개 플래그(-f와 -n)을 함께 사용합니다.

$ docker logs -f -n 0 [컨테이너 ID]

-f는 새로 기록되는 로그를 실시간 출력하며, -n 0는 가장 마지막 0개 로그부터 출력하므로 명령문 실행 이전에 기록된 로그는 모두 출력에서 제외합니다.

특정 문자열을 포함하는 로그만 출력

Linux의 grep 명령어 역시 도커 로그 출력문과 함께 사용 할 수 있습니다. grep으로 지정된 문자열이 포함된 로그 행만 출력합니다.

$ docker logs [옵션] [컨테이너 ID] | grep [문자열]