로그 데이터 통합 관리: ELK 스택 구축 및 Kibana 시각화로 로그 지옥 탈출하기

JavaScript AWS Database 로그 데이터 통합 관리: ELK 스택 구축 및 Kibana 시각화로 로그 지옥 탈출하기 ⏱️ 읽는 시간: 약 8분 | 📊 3,807자 📑 목차 1. 개발자의 악몽, 분산된 로그의 늪에서 우아하게 탈출하기 2. 1. ELK Stack: 왜 하필 이 조합인가? (아키텍처의 미학) 3. 2. 로그스태시(Logstash) 심층 분석: 비정형 로그를 정복하라 개발자의 악몽, 분산된 로그의 늪에서 우아하게 탈출하기 안녕하세요. 15년 차 백엔드 개발자이자, 여러분과 함께 밤새워 코드를 고민하는 멘토입니다. 오늘은 조금 무거운 주제일 수도 있지만, 실무에서 가장 중요한 '생존 기술' 중 하나인 로그 관리에 대해 깊이 있게 이야기해 보려 합니다. 혹시 이런 경험 없으신가요? 금요일 오후 5시, 퇴근을 준비하는데 고객센터에서 "결제가 안 돼요!"라는 긴급 클레임이 들어옵니다. 식은땀을 흘리며 서버에 접속합니다. 그런데 서버가 10대네요? 터미널 창을 10개 띄워놓고 tail -f catalina.out 을 치며 눈이 빠져라 에러 로그를 찾습니다. 텍스트가 폭포수처럼 흘러가고, "이 서버가 아닌가? 저 서버인가?" 하다가 결국 30분이 지나서야 겨우 로그 한 줄을 발견합니다. "NullPointerException". 허탈하죠. 원인을 찾았을 때는 이미 고객들의 불만이 폭주한 뒤입니다. 저는 주니어 시절, 이 '로그 찾아 삼만리' 때문에 여자친구와의 기념일 저녁 약속을 세 번이나 어겼던 뼈아픈 기억이 있습니다. ☕ 커피를 아무리 마셔도 해결되지 않는 피로감과 자괴감은 덤이었...

Docker 컨테이너 로그 무한 증가 해결 json-file 로테이션 설정으로 디스크 공간 확보 완벽 가이드

Docker 컨테이너 로그 무한 증가 해결 json-file 로테이션 설정으로 디스크 공간 확보 완벽 가이드

서버를 운영하다 보면 어느 날 갑자기 "Disk Full" 경고 알람을 받고 당황했던 경험이 한 번쯤 있으실 겁니다. 특히 Docker 컨테이너 기반으로 서비스를 운영하는 환경에서는 애플리케이션 자체의 데이터보다, 컨테이너가 뱉어내는 로그 파일이 기하급수적으로 쌓여 디스크 공간을 모두 잠식해버리는 경우가 빈번하게 발생합니다. 개발 단계에서는 로그를 확인하는 것이 중요하지만, 운영 환경에서 무제한으로 쌓이는 로그는 시한폭탄과도 같습니다. 오늘은 Docker 컨테이너 로그 파일 용량이 무한정 커지는 문제를 근본적으로 해결하고, json-file 로테이션 설정을 통해 시스템의 안정성을 확보하는 방법에 대해 아주 상세하게 알아보겠습니다.

Docker 로그가 디스크 공간을 점유하는 원인과 구조적 이해

Docker를 설치하고 별도의 설정을 건드리지 않은 상태에서 컨테이너를 실행하면, 기본 로깅 드라이버는 'json-file'로 설정됩니다. 이 방식은 컨테이너 내부에서 발생하는 표준 출력(STDOUT)과 표준 에러(STDERR)를 호스트 머신의 특정 경로에 JSON 형식의 파일로 저장하는 구조를 가집니다. 문제는 Docker의 기본 설정에는 이 로그 파일의 크기 제한(Limit)이 없다는 점입니다.

기본 로깅 드라이버 json-file의 작동 방식과 위험성

컨테이너가 실행되는 동안 애플리케이션은 끊임없이 로그를 생성합니다. 웹 서버라면 접속 로그가, 백엔드 애플리케이션이라면 트랜잭션 로그나 디버그 정보가 계속해서 출력됩니다. Docker 데몬은 이 스트림을 낚아채서 호스트의 /var/lib/docker/containers/[컨테이너ID]/[컨테이너ID]-json.log 위치에 텍스트 파일로 기록합니다.

초기에는 파일 크기가 작아 눈에 띄지 않지만, 시간이 지남에 따라 수 기가바이트(GB)에서 수십, 수백 기가바이트까지 커질 수 있습니다. 특히 자바(Java) 기반의 애플리케이션이나 디버그 모드가 켜져 있는 서비스의 경우 하루에도 수십 기가바이트의 로그가 쌓일 수 있습니다. 리눅스 파일 시스템에서 단일 파일의 크기가 너무 커지면, 단순히 디스크 공간만 부족해지는 것이 아니라 해당 파일을 읽거나 쓰는 작업 자체에서 엄청난 I/O 부하가 발생하게 됩니다.

핵심 경고: 로그 파일이 디스크를 100% 채우게 되면, 해당 서버에서 실행 중인 모든 컨테이너가 멈추거나, 데이터베이스가 손상되거나, 심지어 호스트 운영체제 자체가 응답 불능 상태에 빠질 수 있습니다. 이는 단순한 불편함을 넘어 심각한 서비스 장애로 이어집니다.

운영 환경에서 흔히 겪는 로그 관리의 실수

많은 엔지니어들이 초기 구축 단계에서 기능 구현에 집중하느라 로그 정책(Log Policy) 수립을 간과합니다. "나중에 설정하면 되겠지"라고 생각하지만, 실제로는 장애가 발생하고 나서야 로그 파일을 확인하는 경우가 대다수입니다. 또한, 주기적으로 오래된 로그를 지워주는 크론탭(Crontab) 스크립트를 임시방편으로 사용하기도 하는데, 이는 근본적인 해결책이 아닙니다. 스크립트가 실행되기 전에 디스크가 가득 찰 수도 있고, 로그 파일이 열려 있는 상태(Open File Descriptor)에서 파일을 강제로 삭제하면 디스크 공간이 반환되지 않는 '좀비 파일' 문제가 발생할 수도 있기 때문입니다.

Docker 컨테이너 로그 로테이션(Log Rotation) 설정의 모든 것

가장 깔끔하고 확실한 해결책은 Docker가 자체적으로 제공하는 '로그 로테이션' 기능을 활용하는 것입니다. 이 기능은 로그 파일이 일정 크기에 도달하면 새로운 파일을 생성하고, 오래된 파일은 정해진 개수만큼만 남기고 자동으로 삭제하는 방식입니다. 이를 통해 우리는 디스크 사용량의 상한선을 예측하고 통제할 수 있게 됩니다.

max-size와 max-file 옵션의 정확한 이해

로그 로테이션을 설정하기 위해서는 두 가지 핵심 파라미터를 이해해야 합니다. 바로 max-size와 max-file입니다. 이 두 옵션의 조합으로 전체 로그 용량을 제어합니다.

  • max-size: 하나의 로그 파일이 가질 수 있는 최대 크기를 지정합니다. 예를 들어 '10m'으로 설정하면 로그 파일이 10MB가 되었을 때 로테이션(교체)이 일어납니다. 단위로는 k(킬로바이트), m(메가바이트), g(기가바이트)를 사용할 수 있습니다.
  • max-file: 로테이션된 로그 파일을 최대 몇 개까지 보관할지를 지정합니다. 예를 들어 '3'으로 설정하면, 현재 기록 중인 파일 1개와 과거 로그 파일 2개, 총 3개의 파일만 유지됩니다. 가장 오래된 파일은 새로운 로그가 쌓일 때 자동으로 삭제됩니다.

따라서, 만약 max-size를 10m으로, max-file을 3으로 설정한다면, 해당 컨테이너가 차지할 수 있는 최대 로그 용량은 약 30MB로 제한됩니다. 이렇게 계산이 가능해지면 디스크 용량 계획(Capacity Planning)을 명확하게 세울 수 있습니다.

단일 컨테이너 실행 시 CLI 명령어 적용 방법

가장 간단하게 적용하는 방법은 docker run 명령어를 사용할 때 옵션을 직접 주입하는 것입니다. --log-opt 플래그를 사용하여 설정을 전달합니다. 예를 들어 Nginx 컨테이너를 띄울 때 로그 크기를 10MB, 파일 개수를 3개로 제한하고 싶다면 다음과 같은 형태의 명령어를 구상할 수 있습니다.

명령어 예시: docker run -d --name my-web-server --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 nginx

이 방식은 테스트 환경이나 일회성 컨테이너를 실행할 때 유용합니다. 하지만 매번 컨테이너를 실행할 때마다 긴 옵션을 타이핑해야 한다는 단점이 있으며, 실수로 옵션을 빼먹을 경우 다시 로그가 무제한으로 쌓일 위험이 있습니다.

Docker Compose를 활용한 영구적 설정 적용

대부분의 운영 환경에서는 Docker Compose를 사용하여 여러 컨테이너를 관리합니다. docker-compose.yml 파일에 로깅 설정을 명시해두면, 서비스가 재시작되더라도 설정이 유지되므로 훨씬 안전하고 관리가 용이합니다. YAML 파일 내의 각 서비스 항목 아래에 logging 섹션을 추가하여

🔎 관련 상품 추천

아래 링크를 통해 구매 시 운영자에게 일정 수수료가 발생할 수 있습니다.

Docker 컨테이너 로그 파일 용량이 무한정 커질 때 json-file 로테이션 설정으로 디스크 공간 확보하는 법

'Docker 컨테이너 로그 파일 용량이 무한정 커질 때 json-file 로테이션 설정으로 디스크 공간 확보하는 법' 관련 상품을 쿠팡에서 확인해 보세요.

상품 보러가기 →

댓글

이 블로그의 인기 게시물

VS Code에 GitHub Copilot 연동해서 코딩 생산성 높이는 설정 가이드 완벽 정복

Kubernetes란 무엇인가?

해외여행 이심 데이터 안 터질 때 데이터 로밍 차단과 APN 설정 점검으로 네트워크 연결 완벽 해결