Cron任务日志优化:仅在有输出时记录带时间戳的日志
解决Cron任务日志记录问题
方法1:使用awk过滤并添加时间戳(推荐)
直接用awk处理输出,仅当有内容时才添加时间戳并写入日志:
myscript 2>&1 | awk '{print strftime("[%Y-%m-%d %H:%M:%S]"), $0}' >> cron.log
2>&1:合并标准输出(stdout)和标准错误(stderr),确保两者都被捕获awk命令会逐行处理输入:- 若myscript没有输出,awk不会执行任何打印操作,自然不会向日志写入内容
- 若有输出,每一行都会被加上格式化的时间戳后写入日志(如果需要过滤空行,可改为
awk 'NF {print strftime("[%Y-%m-%d %H:%M:%S]"), $0}',NF表示行内存在非空字符)
方法2:先捕获输出再判断写入
通过子shell捕获所有输出,仅当输出非空时才处理并写入:
output=$(myscript 2>&1); [ -n "$output" ] && echo "$output" | ts >> cron.log
output=$(myscript 2>&1):将脚本的所有输出(包括stderr)捕获到变量中[ -n "$output" ]:判断变量是否非空,仅当有内容时才执行后续命令echo "$output" | ts:将输出通过ts添加时间戳后写入日志
原命令产生无效日志的原因
你之前使用的myscript 2>&1 | echo "$(cat -)" | ts >> cron.log存在两个关键问题:
echo "$(cat -)"不管输入是否为空,都会输出至少一个空行(当输入为空时,cat -无输出,$(...)展开为空,echo就会输出空行)ts会给这个空行加上时间戳,导致日志中出现仅含时间戳的无效条目
上面的两种方法都避免了无输出时写入空行的问题,完全通过cron命令行实现,不需要修改脚本本身。
内容的提问来源于stack exchange,提问作者Dom
相关产品推荐
相关产品推荐

