서버 & 운영체제

[Linux/Tomcat] catalina.out 로그 무한 증식 해결! logrotate로 자동 분할 및 압축 관리하기

푸른길땡 2026. 4. 10. 10:49
반응형

서버 디스크 용량 부족의 주범, catalina.out

 

리눅스(Linux) 환경에서 톰캣(Tomcat) 서버를 운영하다 보면 누구나 한 번쯤 겪게 되는 무서운 장애가 있습니다. 바로 **'디스크 용량 100% 초과(Disk Full)로 인한 서버 다운'**입니다. 부랴부랴 서버에 접속해서 원인을 찾아보면, 십중팔구 톰캣의 로그 파일인 catalina.out 파일의 용량이 비정상적으로 비대해져 있는 것을 발견하게 됩니다.

톰캣은 기본적으로 시스템에서 발생하는 모든 표준 출력(System.out)과 에러(System.err)를 catalina.out이라는 하나의 파일에 계속해서 이어붙여 저장합니다. 서비스가 커지고 접속량이 많아질수록 이 파일은 하루에도 몇 기가바이트씩 쌓이게 되죠.

이러한 시한폭탄 같은 로그 파일을 안전하게 관리하기 위해, 리눅스 내장 유틸리티인 logrotate를 활용하여 매일 자정마다 로그를 분할하고, 압축하여 백업하는 완벽한 자동화 방법에 대해 상세히 알아보겠습니다.


1. logrotate 설정 파일 생성하기
리눅스에서는 /etc/logrotate.d/ 디렉터리 안에 설정 파일을 만들어 두면 데몬이 알아서 이를 인식하고 실행합니다. 톰캣 로그 관리를 위한 전용 설정 파일을 하나 생성해 줍니다.

 

# vi 편집기를 열어 설정 파일을 생성합니다.
vi /etc/logrotate.d/tomcat_out_log

 

편집기를 열었다면 아래의 내용을 그대로 작성해 줍니다. (단, 제일 윗줄의 로그 경로 /tomcat/logs/catalina.out 부분은 본인 서버의 실제 톰캣 로그 경로에 맞게 수정해 주셔야 합니다.)

 

/tomcat/logs/catalina.out {
    copytruncate
    daily
    rotate 30
    compress
    missingok
    notifempty
    dateext
}

 

파일 작성이 끝났다면, 시스템이 해당 파일을 정상적으로 읽을 수 있도록 파일의 권한을 644로 맞춰줍니다.

chmod 644 /etc/logrotate.d/tomcat_out_log

 

2. 핵심 옵션 완벽 해부 (copytruncate의 중요성

 

위에서 작성한 설정값들이 각각 어떤 역할을 하는지 정확히 아는 것이 중요합니다. 특히 톰캣 로그 관리에서는 copytruncate 옵션이 핵심 중의 핵심입니다.

copytruncate (가장 중요): 기존 로그 파일을 복사(copy)하여 백업본을 만든 뒤, 원본 파일의 내용을 비워버리는(truncate) 옵션입니다. 톰캣은 실행되는 동안 catalina.out 파일을 계속 물고(File Handle) 있습니다. 만약 이 옵션 없이 파일 이름만 바꿔버리면 톰캣은 길을 잃고 더 이상 로그를 남기지 않게 됩니다. 따라서 톰캣 로그 분할 시에는 선택이 아닌 필수 옵션입니다.

daily: 로그 파일을 '일' 단위로 순환시킵니다. (이 외에도 weekly(주 단위), monthly(월 단위) 옵션이 있습니다.)

rotate 30: 백업된 로그 파일을 최대 30개까지만 보관합니다. 30일이 지난 아주 오래된 로그는 자동으로 삭제하여 디스크 공간을 확보합니다.

compress: 분할된 과거의 로그 파일들을 gzip(*.gz) 형태로 압축하여 보관합니다. 로그 파일은 텍스트 형태라 압축 효율이 매우 뛰어나 디스크 용량 절약에 큰 도움이 됩니다. (압축을 원치 않으면 nocompress를 사용합니다.)

missingok: 만약 톰캣이 꺼져 있어서 로그 파일이 생성되지 않은 상태라도, 에러를 뱉지 않고 다음 작업으로 부드럽게 넘어갑니다.

notifempty: 로그 파일의 내용이 비어있다면(크기가 0이라면) 굳이 헛수고를 하며 새로운 분할 파일을 생성하지 않습니다.

dateext: 분할된 로그 파일 이름 뒤에 단순한 숫자(1, 2, 3...) 대신 catalina.out-20260408 처럼 보기 편하게 날짜를 붙여줍니다.

size 100M (참고): 만약 날짜 기준이 아니라 용량 기준으로 자르고 싶다면 size 옵션을 추가할 수 있습니다. (예: 파일이 100MB를 넘어가면 분할)

 

3. Crontab에 등록하여 매일 자동화하기

 

설정 파일은 만들었지만, 이를 매일 정해진 시간에 실행시키려면 리눅스의 스케줄러인 crontab(크론탭)에 등록해 주어야 합니다.

 

# 크론탭 편집창 열기
crontab -e

 

편집창이 열리면 아래 구문을 추가해 줍니다. 이 설정은 **'매일 새벽 1시 1분'**에 logrotate를 강제(-f)로 실행하여 톰캣 로그를 정리하라는 명령어입니다.

 

01 01 * * * /usr/sbin/logrotate -f /etc/logrotate.d/tomcat_out_log

(작업을 완료한 후 :wq 를 입력하여 저장하고 빠져나옵니다.)

 

보너스 팁: dateyesterday 옵션
보통 로그 분할은 위 크론탭 설정처럼 자정이 막 지난 새벽(예: 00시 01분)에 실행합니다. 이때 dateext 옵션만 쓰면 어제 날짜의 로그가 오늘 날짜의 이름표를 달고 압축되는 헷갈리는 상황이 발생할 수 있습니다. 이럴 때 설정 파일에 dateyesterday 옵션을 추가해 주면, 파일명에 정확히 '어제 날짜'가 찍혀서 저장되므로 나중에 로그를 추적할 때 훨씬 직관적이고 편리합니다.


반응형