0. Intro
놀랍게도 도커의 디폴트 Logging Driver인 'json-file'은 NO log-rotation이라고 한다.
log-rotation이란?
로그 파일의 크기 제한 등의 방법으로 로그 파일이 너무 커지지 않도록 관리하는 것을 의미한다.
결과부터 얘기하자면, 나는 'json-file' 디폴트 드라이버 대신 'local' 드라이버로 바꾸고 max-size, max-file 옵션들은 기본 값 그대로 사용하였다.
어쩌다 로그 관리
도커로 배포한 서비스에서 로그를 확인하던 중 문득 로그가 기록된 첫 날짜를 확인해보고 싶었다. 당연할 수 있겠지만 확인해본 결과, 컨테이너가 run한 시점부터 모든 기록이 쌓이고 있었다. (도커에서 기본적으로 retention 보존 기간이 설정되어 있을 줄 알았다..)
작고 소중한 프리티어 인스턴스를 사용중이었던 터라 로그가 누적되며 파일 크기가 커지고 있었다는 사실에 조금 충격을 받았다. 누적된 로그와 파일 크기를 직접 확인해 보니 파일의 retention(보관 기간)이나 max-file(개수), max-size(크기) 제한 같은 관리가 필요하겠다는 생각을 했다.
"디스크 공간이 터질 수 있는데 왜 디폴트 설정에서 크기를 제한하지 않지?"라고 생각했는데 공식 문서에 따르면 도커 이전 버전과의 하위 호환성 문제와 log rotation이 없는 쿠버네티스에 사용되는 상황을 위해 json-file 드라이버를 디폴트 드라이버로 유지했다고 한다.
이제 Logging Driver별 디폴트 설정 값과 설정 방법에 대해서 살펴보겠다.
1. Docker Log 설정 확인 (사용중인 Logging Driver 확인)
1-1. 저장되는 로그 파일 경로 확인
docker inpect <container_id 또는 container_name>
출력 결과에서 "LogPath"가 로그가 저장되는 위치이다.
기본적으로 "/var/lib/docker/containers/{컨테이너 ID}/{컨테이너 ID}.json.log"로 저장될 것이다.
1-2. 사용 중인 로깅 드라이버 확인
docker info --format '{{.LoggingDriver}}'
특정 컨테이너의 로깅 드라이버 확인 방법은 아래와 같다.
docker inspect --format '{{.HostConfig.LogConfig.Type}}' <container_id 또는 container_name>
2. 'json-file' vs 'local' (Docker Logging Driver)
공통
json-file과 local 모두 컨테이너의 stdout/stderr에서 출력을 캡처하여 기록한다.
Docker Daemon에 의해 file based storage에 저장되며 Daemon만이 접근 가능하다. 그래서 외부 분석 도구나 텍스트 편집기로 로그 파일을 열거나 수정하면 Docker Logging 시스템에 문제를 일으킬 수 있으니 사용할 때 주의해야 한다.
따라서 Docker 데몬이 로그 파일을 독점적으로 관리하도록 하고, 외부 도구를 사용하여 직접 로그 파일을 조작하지 않도록 주의해야 한다. 로그를 확인하거나 분석해야 하는 경우, Docker가 제공하는 명령어(docker logs 등)를 사용하는 것을 권장하고 있다.
json-file
JSON 형식으로 로그가 저장된다.
기본적으로 log-rotation(로그 회전)은 수행되지 않아서 사용 시 주의해야 한다.
-> 디스크 고갈을 방지하려면 로컬 로깅 드라이버 사용하라고 도커 공식 문서에서 권장하고 있다.
-> 근데 왜 이게 default냐? -> 도커 하위 호환성 유지를 위해 + 쿠버네티스 런타임으로 사용되는 상황을 위해 (log-rotation이 없는 상황을 위해)
local
디스크 고갈을 방지하려면 log-rotation이 디폴트로 설정되어있는 local 로깅 드라이버 사용하라고 권장하고 있다.
옵션의 기본값은 아래와 같다.
- max-size : 100MB (컨테이너당 100MB)
- max-file : 5 (최대 갯수 5개)
Local File logging driver 공식문서
3. logging driver 설정하기
daemon.json 구성 파일에서 설정 후 docker 재시작하면 적용된다.
파일은 "/etc/docker/daemon.json"이며, 예시는 아래와 같다.
{
"log-driver": "local",
"log-opts": {
"max-size": "10m"
}
}
4. 마무리하며
로그의 중요성을 많이 듣기도 했고 알고 있었지만 역시 서비스를 직접 운영할 때 몸소 깨닫게 되는 것 같다. 다시 한번 운영 경험의 중요성을 느꼈다. 로그 파일을 실질적으로 분석하고, 활용할 수 있는 방법에 대해서도 고민을 해봐야겠다.
'infra' 카테고리의 다른 글
[AWS] HTTPS 처리를 시작으로 도메인 설정 과정 "이해"로 끝내기 (EC2, ACM, ELB, Route53) (0) | 2024.08.01 |
---|