MongoDBログ切替(Rotate Log Files)実戦
MongoDBログ切替(Rotate Log Files)実戦
1.mongo shellで、logRotateコマンドを実行します.
mongos,mongod,config serverで実行する必要があります.
この方式の変種:
a)unix shellで実行する:
b)Bashスクリプト:
c)以下のスクリプトをlogRotateに保存する.jsファイル:
スクリプトlogRotateを作成します.sh:
d) logRotate.sh//計画タスクcrontabまで書けばいい(expectパッケージが必要)
2.SIGUSR 1信号を使用する:
この方法の変種:
a)pythonで書かれたタイミングスクリプトは,毎日新しいlogを生成し,7日以上のlogを自分で削除する.
rootでcrontab–eタイミングタスクを編集する
3.ログ管理ツールlogrotate
自動化の最善の方法はlogrotateを使用することであり、copytruncateパラメータがよりよく機能します.
次のコードを/etc/logrotateにコピーします.d/mongodbファイルで、スクリプト内のパスとファイル名が正しいことを確認します.
4.Mongodb bug mongodb安定性が好ましくない.切り替え中にmongodbプロセスが終了することもあります.具体的にはmongodb bugシステム:SERVER-4739、SERVER-3339を参照してください.
1.mongo shellで、logRotateコマンドを実行します.
use admin
db.runCommand({logRotate:1})
mongos,mongod,config serverで実行する必要があります.
この方式の変種:
a)unix shellで実行する:
mongo localhost/admin –eval “dbo.runCommand({logRotate:1})”
b)Bashスクリプト:
#!/bin/sh
### log rotate
mongo localhost/admin –evel “db.runCommand({logRotate:1})”
### compress newly rotated
for f in /var/log/mongodb/mongod.log.????-??-??T??-??-??;
do
7za a “$f.z” “$f”
rm –f “$f”
done
c)以下のスクリプトをlogRotateに保存する.jsファイル:
db.getMongo().getDB(“admin”).runCommand({logRotate:1})
スクリプトlogRotateを作成します.sh:
#!/bin/sh
# Clear old logs
rm /var/log/mongodb/mongod.log.*
# Rotate logs
mongo logRotate.js
d) logRotate.sh//計画タスクcrontabまで書けばいい(expectパッケージが必要)
#!/usr/bin/expect –f
spawn /usr/local/mongodb/bin/mongo admin -udev -ptest –quiet
expect ">"
send db.runCommand("logRotate")
send "\r
"
expect ">"
send "exit"
2.SIGUSR 1信号を使用する:
kill –SIGUSR1
find /var/log/mongodb/mongodb.log.* -mtime +7 –delete
この方法の変種:
a)pythonで書かれたタイミングスクリプトは,毎日新しいlogを生成し,7日以上のlogを自分で削除する.
#!/bin/env python
import sys
import os
import commands
import datetime,time
#get mongo pid
mongo_pid = commands.getoutput("/sbin/pidof mongod")
print mongo_pid
#send Sig to mongo
if mongo_pid != '':
cmd = "/bin/kill -USR1 %s" %(mongo_pid)
print cmd
mongo_rotate = commands.getoutput(cmd)
else:
print "mongod is not running..."
#clean log which > 7 days
str_now = time.strftime("%Y-%m-%d")
dat_now = time.strptime(str_now,"%Y-%m-%d")
array_dat_now = datetime.datetime(dat_now[0],dat_now[1],dat_now[2])
lns = commands.getoutput("/bin/ls --full-time /var/log/mongodb/|awk '{print $6, $9}'")
for ln in lns.split('
'):
ws = ln.split()
if len(ws) != 2:
continue
ws1 = time.strptime(ws[0],"%Y-%m-%d")
ws2 = datetime.datetime(ws1[0],ws1[1],ws1[2])
if (array_dat_now - ws2).days > 7:
v_del = commands.getoutput("/bin/rm -rf /var/log/mongodb//%s" % (ws[1]))
rootでcrontab–eタイミングタスクを編集する
0 2 * * * /root/mongo_log_rotate.py >/root/null 2>&1
3.ログ管理ツールlogrotate
自動化の最善の方法はlogrotateを使用することであり、copytruncateパラメータがよりよく機能します.
次のコードを/etc/logrotateにコピーします.d/mongodbファイルで、スクリプト内のパスとファイル名が正しいことを確認します.
# vi /etc/logrotate.d/mongodb
/var/log/mongodb/*.log {
daily
rotate 7
compress
dateext
missingok
notifempty
sharedscripts
copytruncate
postrotate
/bin/kill -SIGUSR1 `cat /var/lib/mongo/mongod.lock 2> /dev/null` 2> /dev/null || true
endscript
}
# logrotate –f /etc/logrotate.d/mongodb
4.Mongodb bug mongodb安定性が好ましくない.切り替え中にmongodbプロセスが終了することもあります.具体的にはmongodb bugシステム:SERVER-4739、SERVER-3339を参照してください.