- 실행된 프로세스에서 생성한 로그 엔트리는 표준 출력(sudout) 및 표준 오류(stderr) 스트림으로 출력된다.
- 도커는 각 컨테이너의 stdout과 stderr스트림을 주시하며 스트림을 통해 출력되는 내용을 수집한다.
- 또한, 터미널 세션과 분리된 컨테이너와 종료된 컨테이너의 로그를 수집할 수 있도록 로그를 JSON 파일로도 저장한다.
- 이 JSON 파일은 도커가 직접 컨테이너와 동일한 생애 주기를 갖도록 관리한다.
실습 15장에서 살펴본 timecheck 애플리케이션을 실행해 로그가 수집되는 과정을 어렵지 않게 확인할 수 있다. 이 애플리케이션은 포어그라운드로 동작하며 stdout으로 로그를 출력한다.
# 컨테이너를 포어그라운드로 실행
➜ docker container run diamol/ch15-timecheck:3.0
Environment: DEV; version: 3.0; time check: 08:56.25
Environment: DEV; version: 3.0; time check: 08:56.30
Environment: DEV; version: 3.0; time check: 08:56.35
Environment: DEV; version: 3.0; time check: 08:56.40
실습 조금 전의 이미지로 컨테이너를 실행하되, 터미널 세션과 분리된 백그라운드로 실행해 보자. 그리고 실행된 컨테이너의 로그 내용 및 로그 파일의 경로를 확인하라.
# 터미널 세션과 분리된 컨테이너를 실행
➜ docker container run -d --name timecheck diamol/ch15-timecheck:3.0
d294094488c150e3191ac5f558654907df2d0f56dce255fc4f763eb4289a4b12
# 최근 로그 확인
➜ docker container logs --tail 1 timecheck
Environment: DEV; version: 3.0; time check: 09:04.22
# 컨테이너 중지 후 로그 확인
➜ docker container stop timecheck
timecheck
➜ docker container logs --tail 1 timecheck
Environment: DEV; version: 3.0; time check: 09:04.57
# 컨테이너 로그 파일 경로 확인
➜ docker container inspect --format='${{.LogPath}}' timecheck
$/var/lib/docker/containers/d294094488c150e3191ac5f558654907df2d0f56dce255fc4f763eb4289a4b12/d294094488c150e3191ac5f558654907df2d0f56dce255fc4f763eb4289a4b12-json.log
- 도커 데스크톱으로 리눅스 컨테이너를 실행 중이라면, 도거 엔진이 별도로 관리되는 가상 머신 안에서 실행된다는 점에 주의해야 한다.
- 이 명령에서 출력된 로그 파일의 경로는 이 가상 머신 내부의 경로이므로 이 파일에 직접 접근할 수 없다.
- 리눅스 환경에서 도커 커뮤니티 에디션을 사용하거나 윈도 컨테이너를 실행했다면, 로그 파일 경로는 로컬 컴퓨터 내부의 경로이므로 로그 파일에 직접 접근할 수 있다.
- 기본적으로 컨테이너마다 JSON 로그 파일 하나가 생성되며, 따로 설정하지 않는 한 디스크 용량이 찰 때까지 이 파일의 크기가 증가한다.
- 로그 파일에 롤링을 적용하면 설정된 파일 용량에 도달한 후 새 파일에 로그를 다시 수집한다.
- 또 최대 파일 개수를 설정해 오래된 파일부터 덮어 쓸 수도 있다.
- 이들 설정은 도커 엔진의 설정이므로 모든 컨테이너에 적용 되지만, 컨테이너별 설정도 가능하다.
실습 같은 애플리케이션을 로그 옵션을 변경해 다시 실행해 보자. 로그 옵션은 롤링 파일 개수를 세 개로 하고, 각 파일의 최대 크기는 5KB로 한다.
001) # 로그 설정을 변경해 애플리케이션 실행(로그 출력 많음)
002) ➜ docker container run -d --name timecheck2 \
003) --log-opt max-size=5k \
004) --log-opt max-file=3 \
005) -e Timer__IntervalSeconds=1 \
006) diamol/ch15-timecheck:3.0
007)
008) # 몇 분간 대기
009)
010) # 로그 내용확인
011) ➜ docker container inspect --format='${{.LogPath}}' timecheck2
- 003: 파일 크기가 5KB에 도달하면 다음 파일로 넘어가도록 설정
- 004: 세 번째 파일의 크기가 설정된 용량에 도달하면 첫 번째 파일을 덮어쓰며 로그를 저장한다