나만 몰랐던 Docker logs

UNG·2022년 1월 21일
2

DevOps

목록 보기
2/2

배운걸 써먹으려니 튜토리얼과 내 서비스의 환경은 사뭇 다르다.

Spring Boot를 Docker로 서비스 할 때 로그 파일명

SpringBoot 서비스를 docker service --replicas=2로 운영하려다보니 로그가 문제다.
host/log 를 container의 /logs 와 바인딩하였고,
2개의 container가 동일한 경로에 동일한 로그 파일이름으로 로깅을 하고 있다.
어떻게 하면 각각의 container의 로그 파일의 이름을 container별로 분리할 수 있을까 찾아보다가

container 내부의 서비스에서 자신의 container에 대한 정보 중 손쉽게 얻을 수 있는 유니크한 값은 결국 ip이거나 hostname 이라는 결론.

hostname = container id

중요한 건 튜토리얼에 나와 있지 않다.

파일 로깅은 내 서비스 특성이라 치고,
docker service logs 명령어로 출력되는 콘솔 로그는 당연히 알아서 잘 시간이 지나면 사라질 거라 생각을 했었는데, 그게 아니었다.

출처: 도커 로깅 문서

Tip: use the “local” logging driver to prevent disk-exhaustion

By default, no log-rotation is performed. As a result, log-files stored by the default json-file logging driver logging driver can cause a significant amount of disk space to be used for containers that generate much output, which can lead to disk space exhaustion.

Docker keeps the json-file logging driver (without log-rotation) as a default to remain backward compatibility with older versions of Docker, and for situations where Docker is used as runtime for Kubernetes.

For other situations, the “local” logging driver is recommended as it performs log-rotation by default, and uses a more efficient file format. Refer to the Configure the default logging driver section below to learn how to configure the “local” logging driver as a default, and the local file logging driver page for more details about the “local” logging driver.

팁이라고 하기엔 너무 중요한 정보잖아.
이럴거면 local을 기본 값으로 해줘도 되지 않았나.
호환성이 더 중요하다고? 난 호환할게 없는데...

Docker container의 로그 기본 값

  • 로그 파일 회전 안함
  • 로그 파일 용량 무제한
  • 로깅 메시지 블록킹

로그 찍다가 파일 용량이 가득차고 디스크가 모자르고 stdout이 블록된다?

흐음...

Docker 기본 log file 경로

docker logs로 출력되는 로그는 ~json.loghost/var/lib/docker/containers/ 에 파일로 존재한다.

컨테이너 아이디와 로그파일명이 같지만 결국은 조회는 해야하니까
컨테이너의 로그파일 경로는 아래 명령어로 조회한다.

$ docker inspect 컨테이너명
# 출력되는 정보에서 LogPath 부분 찾으면 된다.

또는

$ docker inspect 컨테이너명 | grep LogPath

또는

$ docker inspect --format '{{.LogPath}}' 컨테이너명

Docker 기본 log file 사이즈 한번에 보기

위의 명령어와 du 명령어를 조합해서 현재 서비스 중인 모든 컨테이너의 기본 로그 파일 사이즈 출력한다.

$ sudo du -h $(docker inspect --format='{{.LogPath}}' $(docker ps -q))

특정 컨테이너만 보고 싶으면 $(docker ps -q) 이 부분을 컨테이너명(또는 아이디)로 바꾸자.

$ sudo du -h $(docker inspect --format='{{.LogPath}}' 컨테이너명)

Docker container 로깅 변경

container 별로 로깅 드라이버를 지정할 수도 있고, docker 기본 설정을 변경할 수도 있다.

출처: 도커 로깅 드라이버 문서

--log-driver json-file (기본값)

  • 기본으로 사용되는 로깅 드라이버
  • host/var/lib/docker/containers에 쌓임
  • 기본 로그 파일 용량 : 무제한
  • 기본 로그 파일 회전 : 안함

--log-driver none

  • 로깅 안함.
  • docker logs로 출력안됨.
  • 서비스에서 파일로 로깅을 별도로 하고 있으니 이 옵션도 좋다.

--log-driver local (권장)

  • 컨테이너 내부에 파일로 쌓임
  • 기본 로그 파일 용량 : 20m
  • 기본 로그 파일 회전 : 5개
    json-file과는 기본이 다르다. 기본이...

물론 json-file도 설정하면 파일 용량 제한 및 로그 파일 회전을 시킬 수 있다.

중요한 건 기본 설정이 서비스에 문제를 일으킬 수 있다는 것을 알고 있어야 하는 것.

profile
우웅

1개의 댓글

comment-user-thumbnail
2022년 5월 24일

좋은 내용 잘 보고 갑니다
감사합니다.

답글 달기