logrotate 설정 파일 생성
sudo vi /etc/logrotate.d/mongodb
먼저, "/etc/logrotate.d/mongodb" 위치에 "mongodb"라는 파일을 만들어줍니다.
/var/log/mongodb/*.log {
# 로그 파일을 매일 회전시킵니다.
daily
# 로그 파일을 7개까지 보관합니다.
rotate 7
# 압축을 사용하여 공간을 절약합니다.
compress
# 첫 번째 회전 후 로그 파일을 압축합니다.
delaycompress
# 로그 파일이 없어도 오류를 발생시키지 않습니다.
missingok
# 로그 파일이 비어 있지 않을 경우에만 로그 파일을 회전시킵니다.
notifempty
# 모든 파일이 처리된 후 단 한 번만 실행하도록 합니다.
sharedscripts
# 로그 파일 이름에 회전 날짜 추가
dateext
# 새로운 로그 파일을 생성할 때의 사용자와 그룹을 MongoDB 사용자로 지정합니다. (설치시 기본 생성)
create 640 mongodb mongodb
# "postrotate/endscript" 스크립트는 로그 파일을 회전한 직후에 실행됩니다.
# 여기서는 MongoDB의 logRotate 명령을 사용하여 MongoDB가 현재 로그 파일을 닫고 새 로그 파일을 열도록 합니다.
postrotate
/usr/bin/mongosh --eval "db.adminCommand({ logRotate: 1 })"
# 스크립트 종료
endscript
}
설정 값을 넣은 후 저장합니다.
/var/log/mongodb/*.log {
...
postrotate
/usr/bin/mongo --eval "db.adminCommand({ logRotate: 1 })"
...
}
위와 같이 오류 발생시 "/usr/bin/mongosh"를 "/usr/bin/mongo"으로 수정합니다.
logrotate 실행 및 테스트
sudo logrotate /etc/logrotate.conf --debug
이 명령어는 logrotate가 실행되는 과정을 보여주지만, 실제로는 아무런 변경도 적용하지 않습니다. 설정에 문제가 없는지 확인하는 데 유용합니다.
설정이 정상적으로 작동하는 것을 확인한 후, 실제로 logrotate를 실행하려면 다음 명령어를 사용합니다:
sudo logrotate /etc/logrotate.conf
이제 MongoDB의 로그 파일은 설정한 대로 자동으로 회전될 것입니다. /etc/cron.daily/logrotate를 통해 매일 자동으로 실행되도록 설정되어 있으므로 별도의 크론 작업을 설정할 필요가 없습니다.
mongod.conf 설정
systemLog:
destination: file
logAppend: true
logRotate: reopen
path: /var/log/mongodb/mongod.log
로깅과 관련하여 중요한 점은 logAppend 설정입니다. 여기서는 logAppend가 false로 설정되어 있어, MongoDB가 재시작될 때마다 새로운 로그 파일을 생성하게 됩니다. 이는 로그 파일이 계속 누적되지 않고, 매번 덮어쓰게 되므로, logrotate 설정과 함께 사용할 때 문제가 될 수 있습니다. 따라서, "logAppend: true"로 설정되어 있는게 좋습니다.
그리고 "logRotate: reopen"의 경우 MongoDB 서비스를 재시작하지 않고도 로그 파일을 회전할 수 있습니다. 서비스 무중단 로그 회전이 가능합니다.
MongoDB를 표준 방법(apt-get)으로 설치하지 않은 경우
MongoDB를 소스에서 직접 컴파일하거나, 비표준 방법으로 설치한 경우, 이 사용자와 그룹이 자동으로 생성되지 않을 수 있습니다. 그런 경우에는 직접 mongodb 사용자와 그룹을 생성해야 할 수도 있습니다. 다음 명령어를 사용하여 수동으로 생성할 수 있습니다:
sudo useradd -M mongodb
sudo groupadd mongodb
sudo usermod -a -G mongodb mongodb
이 명령들은 mongodb 그룹을 생성하고, mongodb 사용자를 만든 다음, 이 사용자를 mongodb 그룹에 추가합니다. -M 옵션은 홈 디렉토리를 생성하지 않음을 의미합니다, MongoDB 운영에 홈 디렉토리가 필요하지 않기 때문입니다.