배운걸 써먹으려니 튜토리얼과 내 서비스의 환경은 사뭇 다르다.
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
을 기본 값으로 해줘도 되지 않았나.
호환성이 더 중요하다고? 난 호환할게 없는데...
로그 찍다가 파일 용량이 가득차고 디스크가 모자르고 stdout이 블록된다?
흐음...
docker logs로 출력되는 로그는 ~json.log
로 host
의 /var/lib/docker/containers/
에 파일로 존재한다.
컨테이너 아이디와 로그파일명이 같지만 결국은 조회는 해야하니까
컨테이너의 로그파일 경로는 아래 명령어로 조회한다.
$ docker inspect 컨테이너명
# 출력되는 정보에서 LogPath 부분 찾으면 된다.
또는
$ docker inspect 컨테이너명 | grep LogPath
또는
$ docker inspect --format '{{.LogPath}}' 컨테이너명
위의 명령어와 du
명령어를 조합해서 현재 서비스 중인 모든 컨테이너의 기본 로그 파일 사이즈 출력한다.
$ sudo du -h $(docker inspect --format='{{.LogPath}}' $(docker ps -q))
특정 컨테이너만 보고 싶으면 $(docker ps -q)
이 부분을 컨테이너명(또는 아이디)로 바꾸자.
$ sudo du -h $(docker inspect --format='{{.LogPath}}' 컨테이너명)
container 별로 로깅 드라이버를 지정할 수도 있고, docker 기본 설정을 변경할 수도 있다.
출처: 도커 로깅 드라이버 문서
--log-driver json-file (기본값)
host
의 /var/lib/docker/containers
에 쌓임--log-driver none
docker logs
로 출력안됨. --log-driver local (권장)
물론 json-file도 설정하면 파일 용량 제한 및 로그 파일 회전을 시킬 수 있다.
중요한 건 기본 설정이 서비스에 문제를 일으킬 수 있다는 것을 알고 있어야 하는 것.
좋은 내용 잘 보고 갑니다
감사합니다.