티스토리 뷰

개요

  • 비지니스로 돈을 버는 모든 회사에서 운영하는 애플리케이션들은 이 순간에도 끊임 없이 로그를 남기고 있다. 로그를 적재하는 가장 일반적인 형태는 운영 서버에 파일로 남기는 것이다. 이 경우, 상식적으로 시간이 지날수록 로그 파일의 크기가 커진다는 것은 누구나 예상할 수 있다. 따라서, 적재되고 있는 로그 파일을 적절하게 일단위 또는 용량 단위로 분리하고 오래된 로그는 삭제하는 조치가 필연적으로 요구된다. 이를 무시했다가 디스크 용량이 가득 차서 애플리케이션이 작동을 멈추는 장애가 일어나는 것을 간간히 목격해왔다. (이름만 대도 알만한 IT로 먹고 사는 대형 회사들이다.)
  • 대부분의 애플리케이션은 로그를 관리하는 정책을 자체적으로 해결하는 형태를 가진다. Apache, NGINX, 그리고 Java 진영의 SLF4J 구현체들은 자체적으로 로그 파일을 관리하는 기능을 제공하여 따로 정책 관리가 가능하다. 만약, 이러한 애플리케이션에 종속되지 않은 일반적인 로그 파일은 어떻게 관리해야 할까? 리눅스에서 기본적으로 제공되는 logrotate 기능을 이용하면 된다.

logrotate 관리 정책 작성

  • 특정 로그 파일에 대한 관리 정책을 /etc/logrotate.d 경로에 설정 파일로 등록해두면, logrotate가 크론 잡에 의해 매일 1회 자동으로 실행되어 로그 파일을 관리해준다. 작성 예는 아래와 같다.
### 특정 로그 파일에 대한 관리 정책 작성
$ sudo nano /etc/logrotate.d/nginx
/usr/local/nginx/logs/access.log {
    daily
    dateext
    rotate 30
    copytruncate
    missingok
}

/usr/local/nginx/logs/error.log {
    daily
    dateext
    rotate 30
    copytruncate
    missingok
}
  • daily 옵션은 로그 파일을 일 단위로 분리하겠다는 의미이다. 크론 잡이 이 역할을 수행해준다.
  • dateext 옵션은 로그 파일 분리시 분리된 파일에 대한 작명을 로그파일명_YYYYMMDD로 하여 저장하겠다는 의미이다. (ex: access.log-20191025)
  • rotate 30 옵션은 분리된 로그 파일을 최대 30개 보관하고, 나머지 오래된 파일은 삭제하겠다는 의미이다. 위 예제에서는 앞서 daily 옵션에 의해 일 단위로 로그 파일을 격리하도록 설정했으므로, 최대 30일을 보관하겠다는 의미가 된다.
  • copytruncate 옵션은 원본 로그 파일을 유지한채 분리한 부분만 제거하겠다는 의미이다. 특정 애플리케이션은 로그 파일의 이동을 허용하지 않는 경우가 있어, 이 경우 권장되는 옵션이다. 단점은 분리한 부분을 제거하는 아주 짦은 시간동안 새로운 유입 로그가 유실될 가능성이 있다.
  • missingok 옵션은 대상 로그 파일이 존재하지 않을 경우, 오류 메시지 없이 계속 작업을 진행하겠다는 의미이다.

logrotate 테스트 및 즉시 실행

  • 로그 관리 정책을 작성한 후, 내가 작성한 정책이 유효한지 검사해볼 수 있다. 또한, 크론 잡을 기다리지 않고 즉시 로그 파일 분리를 실행하는 것도 가능하다.
# 마지막 로그 로테이션 실행 이력 확인
$ cat /var/lib/logrotate.status

# 로그 로테이션 테스트, 실제 실행하지는 않음
$ sudo logrotate -df /etc/logrotate.d/nginx

# 로그 로테이션 즉시 실행
$ sudo logrotate -vf /etc/logrotate.d/nginx

참고 글

댓글
댓글쓰기 폼