Пришлось на днях настроить ротацию логов mongodb.
С logrotate не сложилось, там костыль на костыле и костылём погоняет.

В общем используем встроенную функцию mongodb для ротации логов и немного ей помогаем.

Создаём скриптик, а потом этот скриптик добавляем в крон.

# vim /root/scripts/mongorotate.sh

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/bin/bash

### log rotate
/usr/bin/kill -USR1 $(cat /var/run/mongodb/mongodb.pid)

### compress newly rotated
for f in /home/logs/mongodb/mongodb.log.????-??-??T??-??-??;
do
gzip "$f"
done

### remove files older than x days
#find /home/logs/mongodb/mongodb.log.????-??-??T??-??-??.gz -ctime +7 -delete

### remove more then X-1 last files
ls -t /home/logs/mongodb/mongodb.log.????-??-??T??-??-??.gz|tail -n+5|xargs -d "\n" -i rm "{}"

  Обратите внимание что в скрипте можно оставлять архивы логов за несколько дней, а можно оставлять просто несколько последних архивов логов. Так же обратите внимание на пути к самим логам и к файлу .pid. Разрешим файлу выполняться  # chmod +x /root/scripts/mongorotate.sh

Добавляем задание в крон # crontab -e

Rotate logs mongodb

0 2 * * * /bin/bash /root/scripts/mongorotate.sh > /dev/null 2> /dev/null

Так же заставить mongodb ротировать лог можно выполнив одну из команд:

1
2
killall -SIGUSR1 mongod
mongo localhost/admin -eval "db.runCommand({logRotate:1})"

Вот и всё