우선 MongoDB 설정에 아래 내용이 적용되어 있어야 함.
systemLog:
logAppend: true
logRotate: reopen
pid, log 파일의 위치는 /var/log/mongodb 아래에 있다고 가정함.
/etc/logrotate.d/mongodb 라는 파일을 만들어 1일 단위로 일주일치 로그를 보관하도록 세팅.
/var/log/mongodb/*.log {
# 매일
daily
# 일주일치
rotate 7
# 로그파일이 없어도 에러내지 않음
missingok
# rotate된 파일명 뒤에 -YYYYmmdd 붙임
dateext
# 여러 로그 파일이라도 스크립트는 1회만 실행
sharedscripts
# logrotate 실행 후 실행할 스크립트 지정
postrotate
# SIGUSR1 시그널을 보내는 MongoDB 자체 log rotate 실행
kill -s USR1 `cat /var/log/mongodb/*.pid`
# 스크립트 종료
endscript
}
이렇게 하면 rotate 될때마다 *.log-YYYYmmdd 파일이 생성됨.
퍼포먼스에 영향을 미칠 수 있는 copytruncate를 이용하지 않고 kill -SIGUSR1 을 사용하여 MongoDB 자체 log rotate 이용.
커맨드라인에선 잘 실행되던 kill -SIGUSR1 명령어가,
logrotate 내부 스크립트로 지정하면 kill이 시그널을 못알아먹고 SIGUSR1: invalid signal specification FAIL 에러가 발생해서 찾아보니,
SIGUSR1 같이 앞에 SIG가 붙는 형식은 POSIX 표준이 아님.
kill -s USR1 <pid> 혹은 kill -USR1 <pid> 형식으로 실행해야 shell을 가리지 않고 정상작동 함.