如何配置crontab,使其生成的日志仅保留error信息并排除warning?
Crontab 日志过滤:仅保留 Error 排除 Warning 方案
问题分析
你之前的命令仅针对特定MySQL密码警告做过滤,无法覆盖所有Warning类型日志,且可能因shell环境、字符串匹配细节导致失效。以下是几种通用且可靠的解决方案:
方案1:全局过滤所有Warning,仅保留Error
如果日志行明确包含Warning/Error关键词(大小写可能不固定),用grep的反向匹配+忽略大小写参数:
45 5 * * * /home/username/barc/backupsql.sh 2>&1 | grep -v -i 'warning'
-v:反向匹配,排除包含指定字符串的行-i:忽略大小写,避免因WARNING/warning大小写差异漏过滤
如果只想保留明确的Error行,也可以直接匹配:
45 5 * * * /home/username/barc/backupsql.sh 2>&1 | grep -i 'error'
方案2:区分标准输出与错误输出(更精准)
多数脚本会把Error输出到stderr(文件描述符2),Warning可能输出到stdout(文件描述符1)。如果符合这个规律,直接丢弃stdout,只保留stderr:
45 5 * * * /home/username/barc/backupsql.sh 2>&1 >/dev/null
>/dev/null:丢弃stdout的内容(Warning大概率在这里)2>&1:把stderr重定向到cron的日志输出,只保留Error信息
方案3:修复原有特定警告的过滤
如果只是那个MySQL密码警告没被过滤,可能是正则匹配的干扰,用固定字符串匹配:
45 5 * * * /home/username/barc/backupsql.sh 2>&1 | grep -F 'Warning: Using a password on the command line interface can be insecure.'
-F:将匹配字符串视为纯文本,避免正则特殊字符(比如冒号、空格)的干扰
方案4:脚本内部处理日志(最可靠)
cron的shell环境和交互式shell不同,管道偶尔会出问题。建议直接在backupsql.sh里处理日志逻辑:
修改脚本内容(以MySQL备份为例):
#!/bin/bash # 执行备份命令并过滤Warning mysqldump -u user -p'password' dbname 2>&1 | grep -v -i 'warning' >> /var/log/backup_error.log
然后简化cron表达式:
45 5 * * * /home/username/barc/backupsql.sh
这种方式避免了cron管道的兼容性问题,日志控制更稳定。
内容的提问来源于stack exchange,提问作者Alex Gonzalez Espinosa
相关产品推荐
相关产品推荐

