MongoDB日志切换(RotateLogFiles)实战
原创 2016-06-07 14:55:53 0236

MongoDB 日志切换(Rotate Log Files)实战 1. 在mongo shell下,执行logRotate命令: useadmindb.runCommand({logRotate:1}) 需要在mongos,mongod,config server运行。 该方式的变种: a) 在unix shell下运行: mongolocalhost/admin–eval“dbo.runComma
MongoDB 日志切换(Rotate Log Files)实战
1. 在mongo shell下,执行logRotate命令:
1 2 | use admin db.runCommand({logRotate:1}) |
需要在mongos,mongod,config server运行。
该方式的变种:
a) 在unix shell下运行:
1 | mongo localhost /admin – eval “dbo.runCommand({logRotate:1})” |
b) Bash脚本:
1 2 3 4 5 6 7 8 9 | #!/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文件:
1 | db.getMongo().getDB(“admin”).runCommand({logRotate:1}) |
创建脚本logRotate.sh:
1 2 3 4 5 | #!/bin/sh # Clear old logs rm /var/log/mongodb/mongod .log.* # Rotate logs mongo logRotate.js |
d) logRotate.sh //写到计划任务crontab即可(需要expect软件包)
1 2 3 4 5 6 7 | #!/usr/bin/expect –f spawn /usr/local/mongodb/bin/mongo admin -udev -ptest –quiet expect ">" send db.runCommand( "logRotate" ) send "\r\n" expect ">" send "exit" |
2. 使用SIGUSR1信号:
1 2 | kill –SIGUSR1 <mongod process= "" id = "" > find /var/log/mongodb/mongodb .log.* -mtime +7 –delete< /mongod > |
该方法的变种:
a) 用python写的定时脚本,每天产生一个新的log,超过7天的log自行删除。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #!/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( '\n' ): 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编辑定时任务
1 | 0 2 * * * /root/mongo_log_rotate .py > /root/null 2>&1 |
3. 日志管理工具logrotate
自动化的最好方式是使用logrotate,其中copytruncate参数能更好工作。
拷贝以下代码到/etc/logrotate.d/mongodb文件中,确保脚本中的路径和文件名正确。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # 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。
来源:oschina
链接:https://my.oschina.net/u/3367404/blog/3062039