Crontab仅收集错误日志异常:mongodump正常输出混入stderr
解决crontab备份脚本只存真正错误日志的问题
为啥mongodump正常输出会进错误日志?
mongodump本身就把进度、状态这类非错误信息输出到stderr,这是它的设计逻辑——避免和导出的二进制数据(走stdout)混在一起。所以你直接捕获脚本的stderr,自然会把这些正常内容也混进去。
几个可行的解决办法
1. 改脚本,单独处理mongodump的输出
在你的备份脚本里,针对mongodump命令做过滤,只把真正的错误行留下来:
# 替换你原来的mongodump命令,示例: mongodump --db mydb --out /backup 2>&1 | grep -i "error" >> /root/scripts/err.log
要是想把mongodump的正常状态信息单独存一份,也可以这么写:
mongodump --db mydb --out /backup 2>&1 | tee >(grep -i "error" >> /root/scripts/err.log) >> /root/scripts/mongodump_status.log
2. 在crontab里直接过滤错误
不想改脚本的话,在crontab里加过滤,只把带错误关键词的行写入日志:
0 0 * * * /root/scripts/dev-vps_backup.sh 2>&1 > /dev/null | grep -i "error\|failed" >> /root/scripts/err.log
提示:这里的
error、failed关键词你可以根据实际错误输出调整,别漏了真正的错误,也别把正常信息误抓进去。
3. 检查脚本里其他命令的输出
看看脚本里的zip之类的命令,确保它们的正常输出走stdout,错误走stderr。要是有其他命令也像mongodump这样乱输出,得单独处理。
你之前的crontab配置为啥没用?
- 第一个配置
>> logfile.log 2>&1 > /dev/null:逻辑是先把stdout写到logfile,再把stderr重定向到stdout(也就是logfile),最后又把stdout扔去/dev/null。实际效果是stderr会进logfile,stdout被丢了,但mongodump正常信息在stderr,所以会被写进去。 - 第二个配置
2>&1 >> all.log | tee -a all.log err.log >&2:逻辑绕来绕去,导致stdout和stderr交叉,反而把所有信息都混进了err.log。
内容的提问来源于stack exchange,提问作者hemant
相关产品推荐
相关产品推荐

