서버를 운영하다 보면 원인 모를 에러로 서비스가 중단되는 상황을 맞이하게 됩니다. 이때 당황하지 않고 가장 먼저 확인해야 할 것이 바로 **로그(Log)**입니다. 하지만 로그를 단순히 쌓아두기만 하면, 어느덧 수십 GB로 커진 로그 파일이 디스크 용량을 점유하여 오히려 서버를 멈추게 하는 원인이 되기도 합니다.
오늘은 리눅스 서버에서 에러 로그를 스마트하게 확인하는 방법과, 로그 파일을 효율적으로 관리해 주는 logrotate 설정법을 상세히 알아보겠습니다.
1. 실시간으로 에러 로그 추적하기: tail 명령어
문제가 발생한 순간, 실시간으로 어떤 메시지가 찍히는지 확인하는 것이 급선무입니다. 이때 가장 유용한 명령어가 tail -f입니다.
1.1 Nginx 에러 로그 확인 예시
sudo tail -f /var/log/nginx/error.log
- -f (follow): 파일의 끝부분을 실시간으로 계속 보여줍니다. 브라우저에서 새로고침을 할 때마다 찍히는 에러를 즉각 확인할 수 있습니다.
1.2 특정 키워드로 필터링하기 (grep)
로그 양이 너무 많을 때는 grep을 조합하여 필요한 정보만 골라냅니다.
sudo tail -f /var/log/nginx/error.log | grep "Critical"
2. 로그 관리의 핵심: logrotate란?
로그는 매일 생성되지만, 모든 과거 로그를 하나의 파일에 보관하는 것은 비효율적입니다. logrotate는 리눅스 시스템 도구로, 로그 파일을 주기적으로 분할(Rotation), 압축(Compression), 삭제(Removal)하여 디스크 공간을 확보해 줍니다.
2.1 logrotate 작동 원리
- 로그 분할: error.log를 error.log.1로 이름을 바꾸고 새 파일을 만듭니다.
- 압축: error.log.1을 error.log.2.gz 형태로 압축하여 용량을 줄입니다.
- 순환: 설정된 개수(예: 7개)가 넘어가면 가장 오래된 로그를 자동으로 삭제합니다.
3. logrotate 실전 설정 가이드
대부분의 주요 서비스(Nginx, MySQL 등)는 설치 시 logrotate 설정이 자동으로 생성됩니다. 하지만 본인이 만든 애플리케이션 로그를 관리하려면 직접 설정 파일을 만들어야 합니다.
3.1 설정 파일 생성
/etc/logrotate.d/ 디렉토리에 서비스 이름으로 파일을 생성합니다.
sudo nano /etc/logrotate.d/my-app
3.2 설정 내용 예시
/var/www/my-app/logs/*.log {
daily # 매일 실행
missingok # 로그 파일이 없어도 에러 내지 않음
rotate 14 # 최대 14일치 로그 보관
compress # 이전 로그 압축(.gz)
delaycompress # 현재 분할된 파일은 다음 주기에 압축
notifempty # 로그가 비어있으면 로테이트 하지 않음
create 0640 www-data adm # 새 로그 파일 권한 설정
sharedscripts
postrotate
# 로그 분할 후 서비스 재시작 명령 (필요 시)
/usr/bin/systemctl reload nginx > /dev/null 2>&1
endscript
}
4. 설정 테스트 및 강제 실행
설정이 올바른지 확인하고 싶다면 아래 명령어로 테스트해 볼 수 있습니다.
# 설정 파일 문법 체크 (드라이 런)
sudo logrotate -d /etc/logrotate.d/my-app
# 조건에 상관없이 즉시 로테이트 실행
sudo logrotate -f /etc/logrotate.d/my-app
5. 결론: 로그는 읽기 위해 존재한다
로그 관리는 단순히 디스크 용량을 아끼는 기술이 아닙니다. 깨끗하게 정리된 로그는 장애 발생 시 **평균 복구 시간(MTTR)**을 획기적으로 줄여줍니다.